1、需求
如标题所示,
要实现检索词补全功能,就是要在输入‘斗鱼直播’的时候,使用该关键词获取以该关键词开头的文本,以下是一个实现的例子。
2、实现
创建索引
{
"properties": {
"name": {
"type": "text",
"analyzer": "ik_smart",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"copy_to":"suggest"
},
"address":{
"type": "text",
"analyzer": "ik_max_word"
},
"suggest":{
"type": "completion",
"analyzer": "ik_smart",
"search_analyzer":"ik_smart"
}
}
}
注意 suggest 字段,其类型为 completion ; name 字段的 copy_to 属性;
创建测试数据
实现代码
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.suggest.Suggest;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.SuggestBuilders;
import org.elasticsearch.search.suggest.completion.CompletionSuggestion;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import java.io.IOException;
public class ElasticsearchTesl {
public static final String host = "localhost";
public static final Integer port = 9200;
public static void main(String[] args) throws IOException{
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost(host, port, "http")));
//检索关键词
String query = "山东";
SearchRequest searchRequest = new SearchRequest("pic");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
CompletionSuggestionBuilder completionSuggestionBuilder = SuggestBuilders.completionSuggestion("suggest")
.prefix(query)
.skipDuplicates(true)
.size(5);
SuggestBuilder suggestBuilder = new SuggestBuilder();
searchSourceBuilder.fetchSource(false);
suggestBuilder.addSuggestion("suggestion_test",completionSuggestionBuilder);
searchSourceBuilder.suggest(suggestBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
Suggest suggest = searchResponse.getSuggest();
//这里的suggestion_test 和上面的对应
CompletionSuggestion completionSuggestion = suggest.getSuggestion("suggestion_test");
for (CompletionSuggestion.Entry entry : completionSuggestion.getEntries()) {
for (CompletionSuggestion.Entry.Option option : entry) {
//suggestText 就是要的补全的结果
String suggestText = option.getText().toString ();
System.out.println(suggestText);
}
}
client.close();
}
}