本文介紹spring-data-elasticsearch:jar:4.0.0.RELEASE版本completion suggest的使用狈茉。
主要用到CompletionSuggestionBuilder
,SuggestBuilder
這兩個(gè)類
同QueryBuilders
一樣suggest也有一個(gè)SuggestBuilders
用于構(gòu)建term
,phrase
,completion
三種類型的suggest構(gòu)造器
CompletionSuggestionBuilder textBuilder =
SuggestBuilders.completionSuggestion("goodsName.suggest")
而對(duì)于Completion的Context Suggest,我們就要用到CategoryQueryContext
和GeoQueryContext
如下:
CategoryQueryContext categoryQueryContext =
CategoryQueryContext.builder().setCategory(cityCode).build();
注意,這里的cityCode是從前端傳遞過(guò)來(lái)的一個(gè)動(dòng)態(tài)參數(shù)原朝,用于限定城市。
接下來(lái)將其封裝到Map中
Map<String, List<? extends ToXContent>> contexts = new HashMap<>();
List<CategoryQueryContext> list = new ArrayList<>();
list.add(categoryQueryContext);
contexts.put("city", list); // 這里要和mapping中配置的name保持一致
最后我們把拼裝好的contexts放到CompletionSuggestionBuilder
中
textBuilder.contexts(contexts);
完整代碼如下:
public List<String> suggest(String keyword, String cityCode) {
HashSet<String> returnSet = new LinkedHashSet<>(); // 用于存儲(chǔ)查詢到的結(jié)果
// 創(chuàng)建CompletionSuggestionBuilder
CompletionSuggestionBuilder textBuilder = SuggestBuilders.completionSuggestion("goodsName.suggest") // 指定字段名
.size(10) // 設(shè)定返回?cái)?shù)量
.skipDuplicates(true) // 去重
// 配置context
CategoryQueryContext categoryQueryContext = CategoryQueryContext.builder().setCategory(cityCode).build();
Map<String, List<? extends ToXContent>> contexts = new HashMap<>();
List<CategoryQueryContext> list = new ArrayList<>();
list.add(categoryQueryContext);
contexts.put("city", list);
textBuilder.contexts(contexts); // 設(shè)置contexts
// 創(chuàng)建suggestBuilder并將completionBuilder添加進(jìn)去
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("suggest_text", textBuilder)
.setGlobalText(keyword);
// 執(zhí)行請(qǐng)求
Suggest suggest = elasticsearchRestTemplate.suggest(suggestBuilder, elasticsearchRestTemplate.getIndexCoordinatesFor(Goods.class)).getSuggest();
// 取出結(jié)果
Suggest.Suggestion<Entry<Option>> textSuggestion = suggest.getSuggestion("suggest_text");
for (Entry<Option> entry : textSuggestion.getEntries()) {
List<Option> options = entry.getOptions();
for (Suggest.Suggestion.Entry.Option option : options) {
returnSet.add(option.getText().toString());
}
}
return new ArrayList<>(returnSet);
}
引入的相關(guān)類
import org.elasticsearch.search.suggest.Suggest;
import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry;
import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.SuggestBuilders;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.completion.context.CategoryQueryContext;
Goods.java
@Document(indexName = "goods", shards = 1, replicas = 0)
@Mapping(mappingPath = "/mappings/goods.json")
@Data
public class Goods {
@Id
private Long goodsId;
private String goodsName;
private String cityCode;
}
由于此版本中FieldType并沒(méi)有提供Completion類型,使用@MultiField無(wú)法達(dá)到目的,因此用@Mapping方式進(jìn)行配置
goods.json
{
"properties": {
"goodsName": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart",
"fields": {
"suggest": {
"type": "completion",
"analyzer": "standard",
"contexts": [
{
"name": "city",
"type": "category",
"path": "cityCode"
}
]
}
}
}
}
}
本文重點(diǎn)介紹4.x版本Completion Suggest的使用蒜焊,如何做到更精確的查找,網(wǎng)上有很多科贬,就不在這里介紹了泳梆。
如果您覺(jué)得有幫助,還望留下一個(gè)贊唄榜掌。