引言

业务系统接入Elasticsearch搜索服务后,开始了写查询接口的任务,本篇博客将总结Java操作Elasticsearch一些基本查询的实现。

基础代码

构建查询条件,对应Elasticsearch其实就是构建SearchRequest对象,指定索引库Name,指定索引库Type,创建SearchSourceBuilder对象,根据需求创建QueryBuilder对象,下面是创建和使用构建对象的基础代码:
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("indexName");
searchRequest.types("indexType");
SearchSourceBuilder builder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
builder.query(boolQueryBuilder);
searchRequest.source(builder);

构造查询条件代码

1. termQuery:精确查询(不分词)

//termQuery 精确匹配,参数(Es中对应字段的keyword,匹配的值)
boolQueryBuilder.filter(QueryBuilders.termQuery("gradeName.keyword", dto.getGradeName()));
使用termQuery要注意的是,Elasticsearch5之后,取消了string类型,将原来的string类型拆分为text和keyword两种类型,他们的区别在于text会对字段进行分词处理,而keyword则不会。下面通过例子来看一下两者的区别:
使用’gradeName.keyword’字段查询,查询条件“六年级”,查询结果如下:

如果在Elasticsearch5之后,查询条件年级传入"六年级",使用’gradeName’字段查询,是查询不到结果的:
//termQuery 精确匹配,参数(Es中的字段key,匹配的值)
boolQueryBuilder.filter(QueryBuilders.termQuery("gradeName", dto.getGradeName()));

原因是在查询中,如果使用’gradeName’查询,是将gradeName作为text类型查询,而使用’gradeName.keyword’,则是将其作为keyword类型查询,前者会对查询内容做分词处理之后再匹配,而后者则是直接精确匹配。
当我们没有对索引字段预先指定mapping,Elasticsearch会进行动态映射,如传入价格字段的值为12,会映射为long类型;对传入ip字段的值为’192.168.0.12’,会映射为ip类型。对于普通字符串,elasticsearch将其映射为text类型,为了保证对这些字段做精确查询和聚合的能力,又同时做了keyword类型的映射,作为该字段的fields属性写到_mapping中。
Elasticsearch的termQuery做的是精确查询而不是分词查询,因此对text类型的字段做term查询则是查不到结果的(除非字段本身经过分词器处理后不变,未被转换或分词)。此时,必须使用gradeName.keyword来对gradeName字段以keyword类型进行精确匹配。

2. matchQuery:匹配查询(分词)

boolQueryBuilder.filter(QueryBuilders.matchQuery("gradeName", dto.getGradeName()));
match query搜索的时候,首先会解析查询字符串,进行分词,然后查询,所以假如我搜索的条件输入的是"六年级",则会把各个年级(一年级至九年级)的数据都查询出来,因为其中都包含’年级’,结果如下:

而上面提到的term query,输入的查询内容是什么,就会按照什么去查询,并不会解析查询内容,对它分词。

3. queryString:精确查询

QueryStringQueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder(dto.getGradeName()).field("gradeName").defaultOperator(Operator.AND);boolQueryBuilder.must(queryStringQueryBuilder);
这里使用QueryStringQueryBuilder构造查询条件,并没有用keyword类型字段’gradeName.keyword’,也可以查询到结果,并且使用defaultOperator拼接操作条件AND或者OR即可。

4. wildcardQuery:模糊查询

//wildcardQuery 模糊匹配,参数(Es中的字段key,匹配的值)
boolQueryBuilder.filter(QueryBuilders.wildcardQuery("phone.keyword", String.format("*%s*", dto.getPhone())));

5. rangeQuery:范围查询

//范围查询(小学阶段:大于等于1,小于等于6)
boolQueryBuilder.filter(QueryBuilders.rangeQuery("gradeCode").from(1, true).to(6, true));
from和to的第二个参数表明是否包含上限值或下限值。

6. Condition 1 OR Condition 2 的实现

BoolQueryBuilder fuzzyQueryBuilder = new BoolQueryBuilder();
fuzzyQueryBuilder.should(QueryBuilders.wildcardQuery("nickName.keyword", String.format("*%s*", dto.getFuzzyCondition()))).should(QueryBuilders.wildcardQuery("phone.keyword", String.format("*%s*", dto.getFuzzyCondition())))
这里的should相当于OR,多个字段之间用should拼接,可实现多个字段模糊查询。

7. (Condition 1 OR Condition 2) AND Condition3 的实现

//构造条件3使用
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
//构造条件1和条件2使用
BoolQueryBuilder fuzzyQueryBuilder = new BoolQueryBuilder();
//手机号或昵称
if (StringUtils.isNotBlank(dto.getFuzzyCondition())) {//must相当于and,拼接条件,should相当于or,多个字段模糊查询条件拼接boolQueryBuilder.must(fuzzyQueryBuilder.should(QueryBuilders.wildcardQuery("nickName.keyword", String.format("*%s*", dto.getFuzzyCondition()))).should(QueryBuilders.wildcardQuery("phone.keyword", String.format("*%s*", dto.getFuzzyCondition()))));
}
//学员类型:付费/未付费
if (dto.getType() != null) {boolQueryBuilder.filter(QueryBuilders.termQuery("type", dto.getType()));
}
这里我们需要构建两个QueryBuilder,在QueryBuilder之间,使用must进行拼接,相当于AND条件。

总结

以上总结的都属于一些基本的查询,能满足目前业务系统的需求,以后遇到高级查询再单独进行总结。

Java操作Elasticsearch6实现基本查询相关推荐

  1. java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询

    1.前缀查询(prefix) //prefix前缀查询 @Testpublic void test15() throws UnknownHostException {//1.指定es集群 cluste ...

  2. JAVA操作 ElasticSearch6.x 查询(内含中文测试数据)

    入门相关概念知识请看这篇 ElasticSearch6.x 入门 基础的增删改请看这篇   ElasticSearch6.x 基本操作 目录 准备工作 term & terms查询 match ...

  3. Java操作Elasticsearch6实现count统计、distinct去重

    引言 很久没有更新Elasticsearch系列文章,一方面是之前学会的条件查询足以满足项目需求,另一方面是前段时间一直很忙,几个项目的需求交叉进行,没什么时间学习新的东西. 本篇博客将更新count ...

  4. es java match_java操作elasticsearch实现条件查询(match、multiMatch、term、terms、reange)...

    1.条件match query查询 //条件查询match query @Testpublic void test10() throwsUnknownHostException {//1.指定es集群 ...

  5. wildcard java_java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询

    1.前缀查询(prefix) //prefix前缀查询 @Testpublic void test15() throwsUnknownHostException {//1.指定es集群 cluster ...

  6. java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询过程解析...

    这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java连接elas ...

  7. java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用...

    java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 1.SQL:select i ...

  8. 【java 操作mysql】java连接mysql数据库并查询数据

    做java开发不可避免要处理数据库,所以这里写篇用jdbc来连接mysql的文章,java是一种高性能,通用的语言 .这使得它适合于编写高效的ETL生产代码和计算密集型的机器学习算法. 主要内容包括: ...

  9. java操作es之各种高级查询

    目录 一.springboot整合es 1.1 pom依赖 1.2 yml配置 1.3 创建索引 1.4 创建映射 1.5 写入数据 二.Java API操作ES 2.1 查询全部 2.2 精准匹配 ...

最新文章

  1. 入职阿里啦!极客时间kotlin
  2. 解决PowerDesigner 16 Generate Datebase For Sql2005/2008 对象名sysproperties无效的问题
  3. html整合vue elementui,vue2.0结合Element-ui实战案例
  4. 圣经是上帝所默示和启示的
  5. POJ NOI MATH-7655 回文数个数
  6. CoolFire系列讲座 第1讲
  7. 深入浅出统计学——笔记(一)1~3章
  8. 一行代码即可删除C盘几十G垃圾,清理c盘垃圾的cmd命令
  9. 小米路由器3 SCUT校园网刷scut-padavan固件方法
  10. 移位和循环移位指令 shl, shr sal, sar, sol, sor, scl, scr, shld, shrd
  11. java后台amr格式转mp3格式方法
  12. 【FXCG】海龟交易法的使用方法和注意事项
  13. 一个小程序走完诉讼全程,腾讯云加速推动“智慧法院”方案落地
  14. tolower()函数
  15. faster rcn固定输入图片尺寸(一)
  16. 深度学习的时间序列分类
  17. 非线性函数线性化方法总结
  18. 丘成桐中学生计算机科学竞赛,丘成桐计算机奖介绍,为什么要参加丘成桐奖?...
  19. 一个不成熟的模板引擎思路
  20. 黄峥不再担任拼多多董事长;恒大首席经济学家任泽平离职 | 高管变动

热门文章

  1. CoreAnimation中layer动画闪烁的原因及解决
  2. 爱因斯坦数学不好,为何能建立广义相对论?
  3. Spark-SQL简介
  4. 搭建Free NAS环境
  5. 天梯赛 L2 列车调度
  6. python:VOC数据集转COCO格式
  7. 微软考试号码与名称对照表
  8. 我不想与任何人比高低
  9. 基于Django以及requests爬虫的音乐网站
  10. 上班偷偷看股票的小软件-火龙果