首先:对索引重构:
"suggest": {
"type": "completion"
},
在索引中加入这个关键词字段;
创建Suggest类:
public class HouseSuggest {
private String input;
private int weight = 10; // 默认权重
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
创建完成之后对先前定义的模板字段进行重新定义;
定义接口:
/**
* 自动补全查询
*
* @param prefix
* @return
*/
ServiceResult<List<String>> suggest(String prefix);
实现接口:
public ServiceResult<List<String>> suggest(String prefix) {
CompletionSuggestionBuilder suggestion = SuggestBuilders.completionSuggestion("suggest").prefix(prefix).size(5);
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("autocomplete", suggestion);
SearchRequestBuilder requestBuilder = this.esClient.prepareSearch(INDEX_NAME).setTypes(INDEX_TYPE)
.suggest(suggestBuilder);
SearchResponse response = requestBuilder.get();
Suggest suggest = response.getSuggest();
Suggest.Suggestion result = suggest.getSuggestion("autocomplete");
int maxSuggest = 0;
Set<String> suggestSet = new HashSet<String>();
for (Object term : result.getEntries()) {
if (term instanceof CompletionSuggestion.Entry) {
CompletionSuggestion.Entry item = (CompletionSuggestion.Entry) term;
if (item.getOptions().isEmpty()) {
continue;
}
for (CompletionSuggestion.Entry.Option option : item.getOptions()) {
String tip = option.getText().string();
if (suggestSet.contains(tip)) {
continue;
}
suggestSet.add(tip);
maxSuggest++;
}
}
if (maxSuggest > 5) {
break;
}
}
List<String> suggests = Lists.newArrayList(suggestSet.toArray(new String[] {}));
return ServiceResult.of(suggests);
}
当我重新更新或者创建ES中的数据的时候就要对规则进行重新配置:
private boolean updateSuggest(HouseIndexTemplate indexTemplate) {
// 需要分词的(对所有可能的关键词进行分词)
AnalyzeRequestBuilder requestBuilder = new AnalyzeRequestBuilder(this.esClient, AnalyzeAction.INSTANCE,
INDEX_NAME, indexTemplate.getTitle(), indexTemplate.getLayoutDesc(), indexTemplate.getRoundService(),
indexTemplate.getDescription(), indexTemplate.getSubwayLineName(),
indexTemplate.getSubwayStationName());
requestBuilder.setAnalyzer("ik_smart");
// 获取分词结果
AnalyzeResponse response = requestBuilder.get();
// 获取每个词
List<AnalyzeResponse.AnalyzeToken> tokens = response.getTokens();
if (tokens == null) {
return false;
}
List<HouseSuggest> suggests = new ArrayList<HouseSuggest>();
for (AnalyzeResponse.AnalyzeToken token : tokens) {
// 排除数字类型 & 小于2个字符的分词结果
if ("<NUM>".equals(token.getType()) || token.getTerm().length() < 2) {
continue;
}
HouseSuggest suggest = new HouseSuggest();
suggest.setInput(token.getTerm());
suggests.add(suggest);
}
// 定制化字段自动补全
HouseSuggest suggest = new HouseSuggest();
suggest.setInput(indexTemplate.getDistrict());
suggests.add(suggest);
indexTemplate.setSuggest(suggests);
return true;
}
调用接口即可