springboot集成Elasticsearch各类搜索功能实现

  • springboot集成Elasticsearch使用completion suggest实现自动关键字补全
    • 建立学生的索引和映射:
    • 开始测试:
    • 接下来是实现获取suggest的代码:
    • 前端代码
  • 实现Fuzzy模糊查询
    • es中的Fuzzy查询语句示例
    • Java实现Fuzzy和高亮返回
  • 数组元素查询
  • Elasticsearch许可证过期

环境准备:
Elasticsearch服务器
ik中文分词器
Kibana服务
一个集成了ES的springboot项目

博主环境:
es:6.2.2 Kibana:6.2.2 springboot:2.1.2

springboot集成Elasticsearch使用completion suggest实现自动关键字补全

定义成completion的字段无法应用highlight返回。

实现目标:建立学生数据索引,以学生姓名为搜索自动补全字段。
学生实体类:

@Document(indexName = "student_index",type="student")
public class Student implements Serializable {@Id@Field(type= FieldType.Auto)private String studentId;
@Override
public String toString() {return "Student{" +"studentId='" + studentId + '\'' +", name='" + name + '\'' +", age=" + age +", scores=" + scores +'}';
}public Student(String studentId, String name, Integer age, List<Double> scores) {this.studentId = studentId;this.name = name;this.age = age;this.scores = scores;
}public Student() {}public String getStudentId() {return studentId;
}public void setStudentId(String studentId) {this.studentId = studentId;
}public String getName() {return name;
}public void setName(String name) {this.name = name;
}public Integer getAge() {return age;
}public void setAge(Integer age) {this.age = age;
}public List<Double> getScores() {return scores;
}public void setScores(List<Double> scores) {this.scores = scores;
}@Field(type=FieldType.Auto)
private String name;@Field(type=FieldType.Auto)
private Integer age;@Field(type=FieldType.Auto)
private List<Double> scores;
}

建立学生的索引和映射:

待搜索的字段需要设置为Completion类型

PUT /student_index
{"mappings": {"student" : {"properties" : {"name" : {"type" :    "completion","analyzer": "ik_smart"},"age" : {"type" :   "integer"},      "studentId" : {"type" :   "text"},        "scores":{"type" :  "float"         }       }}}
}

整点数据测试一下:

学生索引Repository类:

@Repository
public interface StudentRepository extends ElasticsearchCrudRepository<Student,String>{
}

开始测试:

在程序里插入一些数据;

@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Testpublic void contextLoads() {List scores= new ArrayList<>();scores.add(67.2);scores.add(27.2);scores.add(56.2);
/*      studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "张三", 21, scores ));studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "李四", 35, scores ));studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "王二", 45, scores ));studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "张大林", 23, scores ));studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "王大力", 51, scores ));*/studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "刘伯", 21, scores ));studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "刘思想", 35, scores ));studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "王皮皮", 45, scores ));studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "王二丫", 23, scores ));studentIndexRepository.save(new Student(UUID.randomUUID().toString(), "王铁蛋", 51, scores ));}

在Kibana测试

POST /student_index/completion/_search
{ "size": 0,"suggest": {"name-suggest": {"prefix": "王二","completion": {"field": "name"}}}
}

结果正确:

接下来是实现获取suggest的代码:

测试方法

 @Testpublic void testSuggestCompletionProc() {String suggestField="name";//指定在哪个字段搜索String suggestValue="王二";//输入的信息Integer suggestMaxCount=10;//获得最大suggest条数
  CompletionSuggestionBuilder suggestionBuilderDistrict = new CompletionSuggestionBuilder(suggestField).prefix(suggestValue).size(suggestMaxCount);SuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("student_suggest", suggestionBuilderDistrict);//添加suggest//设置查询builder的index,type,以及建议SearchRequestBuilder requestBuilder = this.elasticsearchTemplate.getClient().prepareSearch("student_index").setTypes("student").suggest(suggestBuilder);System.out.println(requestBuilder.toString());SearchResponse response = requestBuilder.get();Suggest suggest = response.getSuggest();//suggest实体Set&lt;String&gt; suggestSet = new HashSet&lt;&gt;();//setint maxSuggest = 0;if (suggest != null) {Suggest.Suggestion result = suggest.getSuggestion("student_suggest");//获取suggest,name任意stringfor (Object term : result.getEntries()) {if (term instanceof CompletionSuggestion.Entry) {CompletionSuggestion.Entry item = (CompletionSuggestion.Entry) term;if (!item.getOptions().isEmpty()) {//若item的option不为空,循环遍历for (CompletionSuggestion.Entry.Option option : item.getOptions()) {String tip = option.getText().toString();if (!suggestSet.contains(tip)) {suggestSet.add(tip);++maxSuggest;}}}}if (maxSuggest &gt;= suggestMaxCount) {break;}}}List&lt;String&gt; suggests = Arrays.asList(suggestSet.toArray(new String[]{}));suggests.forEach((s)-&gt;{System.out.println(s);});//      return   suggests;}

输出结果正确:

封装的工具方法

    /*** completion suggest* @param suggestField* @param suggestValue* @param suggestMaxCount* @param index_* @param indexType_* @param elasticsearchTemplate__* @return*/public List<String> listSuggestCompletion(String suggestField, String suggestValue, Integer suggestMaxCount,String index_,String indexType_,ElasticsearchTemplate elasticsearchTemplate__) {/* String suggestField="name";//指定在哪个字段搜索String suggestValue="王二";//输入的信息Integer suggestMaxCount=10;//获得最大suggest条数*/CompletionSuggestionBuilder suggestionBuilderDistrict = new CompletionSuggestionBuilder(suggestField).prefix(suggestValue).size(suggestMaxCount);SuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("student_suggest", suggestionBuilderDistrict);//添加suggest//设置查询builder的index,type,以及建议if(elasticsearchTemplate__==null)System.out.println( "this is Template null  ***************************************************");SearchRequestBuilder requestBuilder = elasticsearchTemplate__.getClient().prepareSearch(index_).setTypes(indexType_).suggest(suggestBuilder);System.out.println(requestBuilder.toString());SearchResponse response = requestBuilder.get();Suggest suggest = response.getSuggest();//suggest实体Set<String> suggestSet = new HashSet<>();//setint maxSuggest = 0;if (suggest != null) {Suggest.Suggestion result = suggest.getSuggestion("student_suggest");//获取suggest,name任意stringfor (Object term : result.getEntries()) {if (term instanceof CompletionSuggestion.Entry) {CompletionSuggestion.Entry item = (CompletionSuggestion.Entry) term;if (!item.getOptions().isEmpty()) {//若item的option不为空,循环遍历for (CompletionSuggestion.Entry.Option option : item.getOptions()) {String tip = option.getText().toString();if (!suggestSet.contains(tip)) {suggestSet.add(tip);++maxSuggest;}}}}if (maxSuggest >= suggestMaxCount) {break;}}}List<String> suggests = Arrays.asList(suggestSet.toArray(new String[]{}));suggests.forEach((s)->{System.out.println(s);});return     suggests;}

前端代码

前端自动补全用JqueryUI的autocomplete组件。

<script>var availableTags = new Array();$(function() {$("#tags").autocomplete({source: availableTags});});$(document).ready(function() {$("#tags").bind("input propertychange", function () {$("#valuetext").html($(this).val());$.get("searchSuggest?value="+$(this).val(), function (data, status) {var results=data;for(var i=0;i<results.length;i++){availableTags[i]=results[i].texts;}$("#tags").autocomplete({source: availableTags});});});})
</script>

<!-- 标签 -->
<input type=“search” id=“tags” name=“searchvalue” class=“form-control” style=“border-radius: 50px 0 0 50px;” placeholder=“请搜索…”>


实现Fuzzy模糊查询

Fuzzy有纠错功能
应用Fuzzy查询的字段需要是 text 类型的。

es中的Fuzzy查询语句示例

GET /indextest/testmapping/_search/
{"query": {"fuzzy": {"namePinyin": {"value": "zhonghuarenmingonghegu"} } } ,"highlight" :{"fields": {"namePinyin" :{}}}
}

Java实现Fuzzy和高亮返回

    /*** 拼音Fuzzy查询* @param field* @param value* @param highlightField* @param preTag* @param postTag* @param index* @param indexType* @param elasticsearchTemplate* @return*/public List<String> listSearchByPinyin(String field,String value,String highlightField ,String preTag,String postTag,String index, String indexType , ElasticsearchTemplate elasticsearchTemplate){List<String> result = new LinkedList<>();FuzzyQueryBuilder queryBuilder = QueryBuilders.fuzzyQuery(field, value).fuzziness(Fuzziness.TWO).prefixLength(0).maxExpansions(10);HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field(highlightField);highlightBuilder.preTags(preTag);highlightBuilder.postTags(postTag);SearchRequestBuilder requestBuilder = elasticsearchTemplate.getClient().prepareSearch(index).setTypes(indexType).setQuery(queryBuilder).highlighter(highlightBuilder);SearchResponse response = requestBuilder.get();System.out.println(response.getClusters().toString());System.out.println(requestBuilder.toString());SearchHits searchHits = response.getHits();searchHits.forEach(i->{System.out.println(i.getIndex());System.out.println(i.getId());System.out.println(i.getSourceAsString());Text highlightFragment = i.getHighlightFields().get(highlightField).getFragments()[0];result.add(highlightFragment.toString());System.out.println();});return result;}

数组元素查询

这个可以用作标签查询、定位。

Elasticsearch许可证过期

elasticsearch报日志:

org.elasticsearch.ElasticsearchSecurityException: current license is
non-compliant for [security]

替换许可证

到elastic**官网**https://register.elastic.co/注册一下账号,注册邮箱会收到许可证文件

将许可证放到服务器下,用的docker要进入到es容器内,重命名许可证文件名为:license.json

# curl -XPUT -u elastic:yourregistername 'http://133.3.269.211:9200/_xpack/license?acknowledge=true' -H "Content-Type: application/json" -d @license.json


这样就ok了。

springboot集成Elasticsearch实现各种搜索功能相关推荐

  1. springboot集成elasticsearch,实现搜索提示补全功能

    springboot集成elasticsearch,通过实体类创建索引,实现搜索提示补全功能 文章目录 springboot集成elasticsearch,通过实体类创建索引,实现搜索提示补全功能 一 ...

  2. springboot——集成elasticsearch进行搜索并高亮关键词

    目录 1.elasticsearch概述 3.springboot集成elasticsearch 4.实现搜索并高亮关键词 1.elasticsearch概述 (1)是什么: Elasticsearc ...

  3. 【SpringBoot高级篇】SpringBoot集成Elasticsearch搜索引擎

    [SpringBoot高级篇]SpringBoot集成Elasticsearch搜索引擎 1. 什么是Elasticsearch? 2. 安装并运行Elasticsearch 2.1 拉取镜像 2.2 ...

  4. Springboot集成elasticsearch 使用IK+拼音分词

    Springboot集成elasticsearch 使用IK+拼音分词 docker安装ES 下载 docker pull docker.elastic.co/elasticsearch/elasti ...

  5. 自学笔记-SpringBoot集成ElasticSearch

    目录 一.ElasticSearch介绍: 二.ElasticSearch安装: 三.Kibana的安装 四.配置ik分词器 五.Springboot集成ElasticSearch Ⅰ.依赖 Ⅱ.配置 ...

  6. GitChat优质文章-SpringBoot集成Elasticsearch

    Elasticsearch 是一个基于 Lucene 库的搜索引擎.Elasticsearch 是目前大数据领域最热门的技术栈之一.目前 Elasticsearch 被广泛应用在搜索.安全.数据分析等 ...

  7. SpringBoot集成Elasticsearch搜索引擎(九)

    官网:https://www.elastic.co/cn/ 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/i ...

  8. 史上最简单的Elasticsearch教程:SpringBoot集成Elasticsearch 实时流量监测平台

    SpringBoot集成Elasticsearch 实时流量监测平台 目录: 第一章:初尝 Elasticsearch 第二章:玩转 Kibana 第三章:开发原生 Elasticsearch 案例 ...

  9. SpringBoot集成ElasticSearch在启动时报availableProcessors is already set to [8], rejecting [8]

    背景 项目基于SpringBoot并且集成ElasticSearch,今天在编写测试类准备进行单元测试时,报了如下这个错误. Caused by: org.springframework.beans. ...

最新文章

  1. 剑指offer:表示数值的字符串
  2. 账单比较java代码_Java代码比较两个文件的MD5
  3. android activity使用,android,NativeActivity使用
  4. Linux中 /boot 目录介绍 【转载】
  5. LeetCode 656. 金币路径(DP)
  6. python3 使用 pi3 安装软件时候,报错找不到 SSL 附解决方法
  7. pytorch torch.full
  8. grDevices | R语言中的配色方法汇总(Ⅱ-1)
  9. 计算机表格中需要乘法求和,《怎么在Excel表格里面使用乘法求和》
  10. 【信号与系统】学习记录1——1.1信号的分类
  11. AD14一般使用流程
  12. WordArt怎样把endnote的关键词生成词云
  13. excel粘贴时出现故障_解决excel一复制就卡死的问题
  14. QT24A01 TNK以太网变压器
  15. Spring Security完成安全认证
  16. 慕课乐学python单元测试答案_中国大学慕课答案第五章单元测试答案_乐学软件工程完整答案...
  17. SSM考试题库管理系统毕业设计源码069043
  18. 实现一个行内三个div等分_一个div,包含三个小的div,平均分布的样式
  19. linux qq x64,QQ Linux 版时隔多年再次更新,支持 x64、ARM64 等多种架构
  20. 开机就是linux图形界面,怎么进入控制台,输命令? shell

热门文章

  1. zTree 一个依靠 jQuery 实现的多功能 “树插件”
  2. Linux 桌面版太“惨”了。。。
  3. Spring中AOP实现
  4. java 指定 内存_java 运行时指定内存大小
  5. pymysql——Python连接SQL
  6. ubantu 黑屏_策魂三国游戏出现黑屏怎么处理 处理方案一览
  7. 微软放弃“封禁”商业开源!
  8. 灰色关联度分析excel步骤_技术 | 基于灰色关联与粗糙依赖度的甘肃兰州市区泥石流危险性评价...
  9. exe免杀宝典 #exe免杀 #Python打包exe
  10. 什么是码原,波特率,比特率,带宽,容量,信噪比