整合

dao层ItemRepository

package com.futhead.es.dao;import com.futhead.es.model.Item;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;import java.util.List;public interface ItemRepository extends ElasticsearchRepository<Item, Long> {List<Item> findByPriceBetween(double price1, double price2);}

model Item

package com.futhead.es.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)
public class Item {@Idprivate Long id;@Field(type = FieldType.Text, analyzer = "ik_max_word")private String title; //标题@Field(type = FieldType.Keyword)private String category;// 分类@Field(type = FieldType.Keyword)private String brand; // 品牌@Field(type = FieldType.Double)private Double price; // 价格@Field(index = false, type = FieldType.Keyword)private String images; // 图片地址}

pom.xml

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version><scope>provided</scope></dependency>
</dependencies>

es配置

spring.data.elasticsearch.cluster-name=my-application
spring.data.elasticsearch.cluster-nodes=localhost:9300

测试用例

import com.futhead.es.Application;
import com.futhead.es.dao.ItemRepository;
import com.futhead.es.model.Item;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.metrics.avg.InternalAvg;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.test.context.junit4.SpringRunner;import java.util.ArrayList;
import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class EsDemoApplicationTests {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Autowiredprivate ItemRepository itemRepository;@Testpublic void testCreateIndex() {elasticsearchTemplate.createIndex(Item.class);}/*** @Description:定义批量新增方法* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void insertList() {List<Item> list = new ArrayList<>();list.add(new Item(1L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.baidu.com/13123.jpg"));list.add(new Item(2L, "华为META10", " 手机", "华为", 4499.00, "http://image.baidu.com/13123.jpg"));list.add(new Item(3L, "小米手机7", "手机", "小米", 3299.00, "http://image.baidu.com/13123.jpg"));list.add(new Item(4L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.baidu.com/13123.jpg"));list.add(new Item(5L, "华为META10", "手机", "华为", 4499.00, "http://image.baidu.com/13123.jpg"));list.add(new Item(6L, "小米Mix2S", "手机", "小米", 4299.00, "http://image.baidu.com/13123.jpg"));list.add(new Item(7L, "荣耀V10", "手机", "华为", 2799.00, "http://image.baidu.com/13123.jpg"));// 接收对象集合,实现批量新增itemRepository.saveAll(list);}/*** @Description:按照价格区间查询* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void queryByPriceBetween(){List<Item> list = this.itemRepository.findByPriceBetween(2000.00, 3500.00);for (Item item : list) {System.out.println("item = " + item);}}@Testpublic void testTermQuery(){NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();builder.withQuery(QueryBuilders.termQuery("price",998.0));// 查找Page<Item> page = this.itemRepository.search(builder.build());for(Item item:page){System.out.println(item);}}/*** @Description:布尔查询* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void testBooleanQuery(){NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();//        builder.withQuery(
//                QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("title","华为"))
//                        .must(QueryBuilders.matchQuery("brand","华为"))
//        );builder.withQuery(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("title","荣耀")).boost(2.0f).should(QueryBuilders.matchQuery("brand","锤子")));// 查找Page<Item> page = this.itemRepository.search(builder.build());for(Item item:page){System.out.println(item);}}/*** @Description:嵌套聚合,求平均值* @Author: https://blog.csdn.net/chen_2890*/@Testpublic void testSubAgg(){NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 不查询任何结果queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null));// 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brandqueryBuilder.addAggregation(AggregationBuilders.terms("brands").field("brand").subAggregation(AggregationBuilders.avg("priceAvg").field("price")) // 在品牌聚合桶内进行嵌套聚合,求平均值);// 2、查询,需要把结果强转为AggregatedPage类型AggregatedPage<Item> aggPage = (AggregatedPage<Item>) this.itemRepository.search(queryBuilder.build());// 3、解析// 3.1、从结果中取出名为brands的那个聚合,// 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型StringTerms agg = (StringTerms) aggPage.getAggregation("brands");// 3.2、获取桶List<StringTerms.Bucket> buckets = agg.getBuckets();// 3.3、遍历for (StringTerms.Bucket bucket : buckets) {// 3.4、获取桶中的key,即品牌名称  3.5、获取桶中的文档数量System.out.println(bucket.getKeyAsString() + ",共" + bucket.getDocCount() + "台");// 3.6.获取子聚合结果:InternalAvg avg = (InternalAvg) bucket.getAggregations().asMap().get("priceAvg");System.out.println("平均售价:" + avg.getValue());}}
}

打印es搜索语句(DSL)

@Test
public void testMathQuery(){// 创建对象NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 在queryBuilder对象中自定义查询//matchQuery:底层就是使用的termQueryqueryBuilder.withQuery(QueryBuilders.matchQuery("title","坚果"));//查询,search 默认就是分页查找SearchQuery searchQuery = queryBuilder.build();//打印查询语句;System.out.println("拼接的查询请求======");System.out.println(searchQuery.getQuery().toString());Page<Item> page = this.itemRepository.search(searchQuery);//获取数据long totalElements = page.getTotalElements();System.out.println("获取的总条数:"+totalElements);
}

简单的增加权重(boost)

@Test
public void testBooleanQuery(){NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();builder.withQuery(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("title","荣耀")).boost(2.0f).should(QueryBuilders.matchQuery("brand","锤子")));Page<Item> page = this.itemRepository.search(builder.build());for(Item item:page){System.out.println(item);}
}

ik分词器,支持热更新

github地址:https://github.com/medcl/elasticsearch-analysis-ik

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords">custom/ext_stopword.dic</entry><!--用户可以在这里配置远程扩展字典 --><entry key="remote_ext_dict">location</entry><!--用户可以在这里配置远程扩展停止词字典--><entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>

Ps. 该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。

同义词、近义词热更新

获取插件

github地址:https://github.com/bells/elasticsearch-analysis-dynamic-synonym

使用方法同ik分词器

Ps. release版本比较少,一般需要根据自己的elasticsearch版本编译

eg. 我们使用的事es6.5.0

git clone https://github.com/bells/elasticsearch-analysis-dynamic-synonym.git

在提交分支记录中找到和自己使用的elasticsearch版本最近的分支,比如,我们用的6.5.0,提交记录支持到6.3.1

git checkout dbe8ebeb6b92d9b403acb76020ea7d64b39abcc8

修改pom.xml文件中的version为6.5.0

编译:mvn clean package

在target/release目录下就能看到最终输出的插件压缩包。

ps. 6.5.0中日志升级了,直接编译不能通过,需要修改

//import org.elasticsearch.common.logging.ESLoggerFactory;
import org.elasticsearch.common.logging.Loggers;//private static Logger logger = ESLoggerFactory.getLogger("dynamic-synonym");
private static Logger logger = Loggers.getLogger(String.class,"dynamic-synonym");

使用

近义词的两种形式:

# synonyms.txt
西红柿 圣女果 番茄 => 洋柿子    # 将 => 左边的词在分词的时候划归为右边的词,检索时只能检索右边的词
西红柿, 圣女果, 番茄    # 三个词同意,检索任何一个也能搜索到另外两个

参考资料

https://blog.csdn.net/chen_2890/article/details/83895646

springboot整合elasticsearch及热更新字典及同义词相关推荐

  1. 七、SpringBoot整合elasticsearch集群

    @Author : By Runsen @Date : 2020/6/12 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘 ...

  2. SpringBoot整合elasticsearch (java整合es)

    欢迎大家进群,一起探讨学习 微信公众号,每天给大家提供技术干货 博主技术笔记 博主网站地址1 博主网站地址2 博主开源微服架构前后端分离技术博客项目源码地址,欢迎各位star SpringBoot整合 ...

  3. Springboot整合Elasticsearch(High-level-Client)

    前言 通过学习Elasticsearch一小段时间来稍微认识了一点ES的体系架构.发现ES最大的坑就是版本兼容性问题了-在整合Springboot也不例外,但是,有一种方式能较好的解决-通过restc ...

  4. SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)

    准备工作# 环境准备# JAVA版本 Copy java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1. ...

  5. 微服务商城系统(六)商品搜索 SpringBoot 整合 Elasticsearch

    文章目录 一.Elasticsearch 和 IK 分词器的安装 二.Kibana 使用 三.数据导入 Elasticsearch 1.SpringData Elasticsearch 介绍 2.搜索 ...

  6. java-web系列(九)---SpringBoot整合ElasticSearch

    前言 这个项目的github地址:extensible项目的github地址 extensible项目当前功能模块如下: java-web系列(一)-搭建一个基于SSM框架的java-web项目 ja ...

  7. SpringBoot整合Elasticsearch(一)

    SpringBoot整合Elasticsearch 基础环境 SpringBoot 版本 : 2.4.0 ES 版本: 7.9.3 Kibana版本: 7.9.3 SpringBoot内置Tomcat ...

  8. es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch

    ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...

  9. SpringBoot整合ElasticSearch实现多版本的兼容

    前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...

最新文章

  1. raspberry pi下使用mp3blaster播放mp3音乐
  2. 为什么我的Button文本被迫在Lollipop上全部大写?
  3. 七值逻辑与基本数据类型
  4. 通过Gogs部署git仓库
  5. Server 2008 R2 AD RMS完整部署:一、用户创建篇
  6. 【工业4.0】什么是工业4.0,这篇文章讲得明明白白!
  7. python学习网站-有哪些值得推荐的Python学习网站?
  8. 15款顶级开源人工智能工具推荐
  9. UE4 虚幻引擎,3D数学(一),3D坐标系,2D坐标系
  10. VC编程来操纵Office
  11. VSCode Setting Sync同步设置
  12. Android CameraX 仿一甜相机(录像、拍照、可调节尺寸、聚焦、照明、网格线),最全的CameraX教程
  13. cocos creator 优量汇广告接入
  14. uniapp制作App实现下载系列功能
  15. 需要知道关于struct的一些事情
  16. imo班聊未读消息提示优化
  17. GSWiFi路由器苹果安卓手机辅助连接通用方法-网线版(图文教程)
  18. 硬盘安装FB{ZT}
  19. 深圳大学计算机图形学期末大作业——OpenGL glfw库实现简单的Minecraft游戏
  20. 计算机科学期刊几个外审,期刊投稿服务发表论文外审一般几个专家审稿_优发表...

热门文章

  1. Ray Tracing From The Ground Up--Kevin Suffern--光线跟踪算法技术 [美]萨芬著 刘天慧译(清华大学出版社) 2011 英文原版+中文译版pdf
  2. Mac Beyond Compare4 破解
  3. 动环系统之漏水监控系统的调试
  4. tilemap 导入unity_unity的Tilemap学习笔记
  5. python中map_python中map()与zip()操作方法
  6. cnc数控刀具管理对企业的重要性你知道吗?
  7. 西蒙菲莎计算机专业,西蒙菲沙大学计算机专业课程设置
  8. The JAVA_HOME environment variable is not defined correctly,
  9. 胎压计气压表解决方案
  10. javaweb班级通讯录管理系统的设计