@
- 摘要
- springboot代码
- 依赖
- 代码
- kibana代码
- 第一部分:设置index、type、mapping
- 第二部分:批量插入
- 第三部分:执行
- 第四部分:结果展示
- 本人先关其他文章链接
摘要
所谓自动补全功能就是“百度搜索框”中每敲下一个字符下面的提示框就会动态改变提示的功能,就是下面的效果:↓
说明:使用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}}]}]}
}
本人先关其他文章链接
1.ElasticSearch7.6.x 模板及滚动索引创建及注意事项
https://blog.csdn.net/a924382407/article/details/115082265
2.ElasticSearch的IK分词器
https://blog.csdn.net/a924382407/article/details/117255506
3.ElasticSearch核心概念:倒排索引
https://blog.csdn.net/a924382407/article/details/117255449
4.springboot集成ElasticSearch使用completion实现补全功能
https://blog.csdn.net/a924382407/article/details/115868167
5.ES Restful API讲解使用
https://blog.csdn.net/a924382407/article/details/115085022
6.ES API,使用Kibana的开发工具用例说明
https://blog.csdn.net/a924382407/article/details/115084549