1.添加依賴
<!--elasticsearch依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.yml中增加es配置
spring
elasticsearch:
rest:
uris: http://127.0.0.1:9200
3.索引實(shí)體類
@Data
@FieldNameConstants
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "index_search")
public class IndexSearch {
@Id
private long id;
@ApiModelProperty(value = "名稱")
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String name;
@ApiModelProperty(value = "別名")
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String displayName;
@ApiModelProperty(value = "分類 1類型 2物質(zhì) 3省 4市")
@Field(type = FieldType.Integer)
private Integer category;
@ApiModelProperty(value = "時(shí)間")
@Field(type = FieldType.Date, format = DateFormat.basic_date, pattern = "yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date controlTime;
@ApiModelProperty(value = "包含隸屬")
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String contain;
@ApiModelProperty(value = "主要省")
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String mainProvince;
@ApiModelProperty(value = "次要省")
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String secondaryProvince;
@ApiModelProperty(value = "主要市")
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String mainCity;
@ApiModelProperty(value = "次要市")
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String secondaryCity;
@ApiModelProperty(value = "其他省")
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String otherProvince;
@ApiModelProperty(value = "其他市")
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String otherCity;
/*
定義關(guān)鍵詞索引 要完成補(bǔ)全搜索,必須要用到特殊的數(shù)據(jù)類型completion,
要漢字拼音都能補(bǔ)全,必須要使用自定義的ik+pinyin分詞器
maxInputLength:設(shè)置單個(gè)輸入的長(zhǎng)度,默認(rèn)為50 UTF-16 代碼點(diǎn)*/
@CompletionField(analyzer = "ik_max_word", searchAnalyzer = "keyword", maxInputLength = 100)
private Completion completion;
}
4.實(shí)現(xiàn)Repository
public interface IndexSearchRepository extends ElasticsearchRepository<IndexSearch, Long> {
@Highlight(
fields = {
@HighlightField(name = "name"),
@HighlightField(name = "displayName"),
},
parameters = @HighlightParameters(preTags = "<strong>",
postTags = "</strong>", fragmentSize = 500,numberOfFragments= 3))
SearchPage<IndexSearch> findByNameOrDisplayName(String name,String displayName, Pageable pageable);
}
5.控制器具體實(shí)現(xiàn)
分頁(yè)查詢,高亮查詢
@Autowired
private SubstanceSearchRepository repository;
//使用es API進(jìn)行分頁(yè)高亮查詢
@GetMapping("/listSearch")
public RestResult<ListPageResult<IndexSearch>> getPageData(@RequestParam String name,
@RequestParam(defaultValue = "0") Integer pageNumber,
@RequestParam(defaultValue = "10") Integer pageSize) {
SearchPage<SubstanceSearch> pageData = repository.findByNameOrDisplayName(name, name,PageRequest.of(pageNumber, pageSize));
try {
// 得到查詢結(jié)果返回的內(nèi)容
List<SearchHit<IndexSearch>> searchHits = pageData.getContent();
// 設(shè)置一個(gè)需要返回的實(shí)體類集合
List<IndexSearch> discussPosts = new ArrayList<>();
// 遍歷返回的內(nèi)容進(jìn)行處理
for (SearchHit<IndexSearch> searchHit : searchHits) {
// 高亮的內(nèi)容
Map<String, List<String>> highLightFields = searchHit.getHighlightFields();
// 將高亮的內(nèi)容填充到content中
searchHit.getContent().setName(highLightFields.get("name") == null ? searchHit.getContent().getName() : highLightFields.get("name").get(0));
searchHit.getContent().setDisplayName(highLightFields.get("displayName") == null ? searchHit.getContent().getDisplayName() : highLightFields.get("displayName").get(0));
// 放到實(shí)體類中
discussPosts.add(searchHit.getContent());
}
return RestResultHelper.success(new ListPageResult<IndexSearch>(pageData.getSize(), pageData.getNumber(), pageData.getTotalPages(), pageData.getTotalElements(), discussPosts));
} catch (Exception e) {
e.printStackTrace();
return RestResultHelper.error();
}
}
自動(dòng)補(bǔ)全
@Autowired
private ElasticsearchRestTemplate restTemplate;
/**
* 自動(dòng)補(bǔ)全方法
**/
@GetMapping("/suggest")
public RestResult<List<String>> suggest(String prefix) {
List<String> results = new ArrayList<>();
CompletionSuggestionBuilder completionSuggestionBuilder = new CompletionSuggestionBuilder(IndexSearch.Fields.completion)
.prefix(prefix)
.skipDuplicates(true).size(10);
SuggestBuilder suggestBuilder = new SuggestBuilder()
.addSuggestion("name_suggest", completionSuggestionBuilder);
SearchResponse response = restTemplate.suggest(suggestBuilder, IndexCoordinates.of("index_search"));
Suggest suggest = response.getSuggest();
Suggest.Suggestion suggestion = suggest.getSuggestion("name_suggest");
List<CompletionSuggestion.Entry> entries = suggestion.getEntries();
entries.forEach(entry -> {
List<CompletionSuggestion.Entry.Option> options = entry.getOptions();
options.forEach(option -> {
results.add(option.getText().toString());
});
});
return RestResultHelper.success(results);
}
添加文檔數(shù)據(jù)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-552279.html
//添加數(shù)據(jù)
@Autowired
private SubstanceSearchRepository repository;
@GetMapping("/insert")
public void addData() throws Exception {
List<IndexSearch> orderDocs = new ArrayList<>();
for (int i = 0; i < 15; i++) {
String title = "類型";
suggestList = new ArrayList<>();
title += i;
suggestList.add(title); //可以把多個(gè)內(nèi)容作為suggest的數(shù)據(jù)源
suggestList.add("別名" + i);
Completion suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
IndexSearch orderDoc = new IndexSearch(i, title, title, 1, new Date(), "隸屬", "主要省", "次要省", "主要市", "次要市", "其他省", "其他市",suggest);
orderDocs.add(orderDoc);
}
repository.saveAll(orderDocs);
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-552279.html
到了這里,關(guān)于springboot與es集成操作-基礎(chǔ)篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!