文章目录

  • ​​摘要​​
  • ​​springboot代码​​
  • ​​依赖​​
  • ​​代码​​
  • ​​kibana代码​​
  • ​​第一部分:设置index、type、mapping​​
  • ​​第二部分:批量插入​​
  • ​​第三部分:执行​​
  • ​​第四部分:结果展示​​
  • ​​本人先关其他文章链接​​

摘要

所谓自动补全功能就是“百度搜索框”中每敲下一个字符下面的提示框就会动态改变提示的功能,就是下面的效果:↓

springboot集成ElasticSearch使用completion实现补全功能_spring boot


springboot集成ElasticSearch使用completion实现补全功能_java_02

说明:使用RestHighLevelClient 即可实现输入框补全功能

  • springboot代码
  • kibana代码

springboot代码

依赖

<!--ES-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.8.12</version>
<exclusions>
<exclusion>
<artifactId>elasticsearch</artifactId>
<groupId>org.elasticsearch</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.8.12</version>
</dependency>

代码

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.search.suggest.Suggest;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
@Autowired
private RestHighLevelClient client;
public static final int NINE = 9;
public static final int TEN = 10;

/**
* 输入框自动补全提示功能(ElasticSearch使用completion实现补全功能)
* @param request request
* @param suggestValue 输入参数
* @author liudz
* @date 2021/4/19
* @return 执行结果
**/
@GetMapping(value = "/completion")
public Response<List<String>> getSuggestCompletion(@RequestParam String suggestValue, HttpServletRequest request) {
log.info("--getSearchSuggest--begin--");
Long userId = Long.valueOf(request.getUserPrincipal().getName());
//指定在哪个字段搜索
String suggestField = "region";

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//suggestField为指定在哪个字段搜索,suggestValue为输入内容,TEN为10,代表输出显示最大条数
CompletionSuggestionBuilder suggestionBuilderDistrict =
new CompletionSuggestionBuilder(suggestField).prefix(suggestValue).size(TEN);
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("my_suggest", suggestionBuilderDistrict);
searchSourceBuilder.suggest(suggestBuilder);
SearchRequest searchRequest = new SearchRequest(userId + esIndex);
searchRequest.types(esType);
searchRequest.source(searchSourceBuilder);
SearchResponse response = null;
try {
response = client.search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
log.error("IOException:{}", e);
}
Suggest suggest = response.getSuggest();

List<String> keywords = null;
if (suggest != null) {
keywords = new ArrayList<>();
List<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> entries =
suggest.getSuggestion("my_suggest").getEntries();
for (Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option> entry: entries) {
for (Suggest.Suggestion.Entry.Option option: entry.getOptions()) {
String keyword = option.getText().string();
if (!StringUtils.isEmpty(keyword)) {
if (keywords.contains(keyword)) {
continue;
}
keywords.add(keyword);
if (keywords.size() >= NINE) {
break;
}
}
}
}
}
return Response.success(keywords);
}

kibana代码

第一部分:设置index、type、mapping

说明:设置某个字段"type": "completion"即可

PUT 12_assets_directory_v1/
{
"index_patterns": "test-logs-*",
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "pattern",
"pattern":["_","-"]
}
}
}
},
"mappings": {
"_doc":{
"properties": {
"file_name": {
"type": "text",
"copy_to": "region"
},
"file_type": {
"type": "keyword"
},
"database_name": {
"type": "text",
"analyzer": "ik_max_word",
"copy_to": "region"
},
"table_name": {
"type": "text",
"analyzer": "ik_max_word",
"copy_to": "region"
},
"include_fields": {
"type": "text",
"index": false
},
"source_business": {
"type": "integer",
"index": false
},
"store_type": {
"type": "text",
"index": false
},
"whether_online": {
"type": "byte",
"index": false
},
"foreign_id": {
"type": "integer",
"index": false
},
"update_time": {
"type": "long",
"index": false
},
"region": {
"type": "completion",
"analyzer": "ik_max_word"
}
}
}
}
}

第二部分:批量插入

批量插入每个json必须单独存在一行

POST _bulk/?refresh=true
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "Lucene is cool","file_type": "file","database_name": "","table_name": "","include_fields": "","source_business": 1,"store_type": "hdfs","whether_online": 0,"foreign_id": 10,"update_time": 1618560193000}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "Lucene用户文件","file_type": "file","database_name": "","table_name": "","include_fields": "","source_business": 1,"store_type": "hdfs","whether_online": 0,"foreign_id": 11,"update_time": 1618560193010}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "103-is-cool","file_type": "file","database_name": "","table_name": "","include_fields": "","source_business": 1,"store_type": "hdfs","whether_online": 0,"foreign_id": 12,"update_time": 1618560193040}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "103_is_cool","file_type": "file","database_name": "","table_name": "","include_fields": "","source_business": 1,"store_type": "hdfs","whether_online": 0,"foreign_id": 20,"update_time": 1618560193120}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "103 is cool","file_type": "file","database_name": "","table_name": "","include_fields": "","source_business": 1,"store_type": "hdfs","whether_online": 0,"foreign_id": 17,"update_time": 1618560193070}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "test001","file_type": "file","database_name": "","table_name": "","include_fields": "","source_business": 1,"store_type": "hdfs","whether_online": 0,"foreign_id": 18,"update_time": 1618560193080}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "test002 ldz","file_type": "file","database_name": "","table_name": "","include_fields": "","source_business": 1,"store_type": "hdfs","whether_online": 0,"foreign_id": 19,"update_time": 1618560193090}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "美丽心之所想","file_type": "file","database_name": "","table_name": "","include_fields": "","source_business": 1,"store_type": "hdfs","whether_online": 0,"foreign_id": 13,"update_time": 1618560193050}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "魅力","file_type": "file","database_name": "美好","table_name": "","include_fields": "","source_business": 1,"store_type": "hdfs","whether_online": 0,"foreign_id": 14,"update_time": 1618560193060}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "","file_type": "table","database_name": "geespace_bd_platform_dev","table_name": "12_mysql-1","include_fields": "","source_business": 1,"store_type": "mysql","whether_online": 0,"foreign_id": 10,"update_time": 1618560193020}
{ "index" : { "_index" : "12_assets_directory_v1","_type" : "_doc" }}
{ "file_name": "","file_type": "table","database_name": "geespace_bd_platform_dev","table_name": "103_addserialnumber_2","include_fields": "","source_business": 1,"store_type": "mysql","whether_online": 0,"foreign_id": 11,"update_time": 1618560193030}

第三部分:执行

“song-suggest”为自定义的别名,“field”为要查询的字段

POST 12_assets_directory_v1/_search?pretty
{
"suggest": {
"song-suggest": {
"prefix": "g",
"completion": {
"field": "region"
}
}
}
}

第四部分:结果展示

返回json中options集合中的text即为补全提示的内容

{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : 0.0,
"hits" : [ ]
},
"suggest" : {
"song-suggest" : [
{
"text" : "g",
"offset" : 0,
"length" : 1,
"options" : [
{
"text" : "geespace_bd_platform_dev",
"_index" : "12_assets_directory_v1",
"_type" : "_doc",
"_id" : "jIkR6HgBdsS-EtqKoYwv",
"_score" : 1.0,
"_ignored" : [
"region"
],
"_source" : {
"file_name" : "",
"file_type" : "table",
"database_name" : "geespace_bd_platform_dev",
"table_name" : "12_mysql-1",
"include_fields" : "",
"source_business" : 1,
"store_type" : "mysql",
"whether_online" : 0,
"foreign_id" : 10,
"update_time" : 1618560193020
}
},
{
"text" : "geespace_bd_platform_dev",
"_index" : "12_assets_directory_v1",
"_type" : "_doc",
"_id" : "jYkR6HgBdsS-EtqKoYwv",
"_score" : 1.0,
"_ignored" : [
"region"
],
"_source" : {
"file_name" : "",
"file_type" : "table",
"database_name" : "geespace_bd_platform_dev",
"table_name" : "103_addserialnumber_2",
"include_fields" : "",
"source_business" : 1,
"store_type" : "mysql",
"whether_online" : 0,
"foreign_id" : 11,
"update_time" : 1618560193030
}
}
]
}
]
}
}