Es学习系列之一: 常见的查询场景总结
2017-12-27 16:11
274 查看
前言
Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
1.模糊查询
在平常的查询中经常有用到模糊查询的情况,而且模糊查询在Es中提供了多种实现的方式:wildcardQuery 通配符查询 中文只能支持关键字查询
prefixQuery 前匹配查询 中文只能支持关键字查询
regexpQuery 正则表达式查询 中文只能支持关键字查询
fuzzyQuery 模糊查询 不支持数字的模糊,中文只能支持单字模糊
2.中文查询
在Es中由于中文的分词方式的影响,上述常见的几种模糊查询的方式都不能完美的支持中文模糊查询的情况。matchPhrasePrefixQuery,matchPhraseQuery则能满足大部分情况下的中文模糊匹配,代码如下
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.should(QueryBuilders.matchPhrasePrefixQuery("name", key));
3.范围查询
RangeQuery:
3.1 如果是String则是关键字范围查询,number/date类型则是大小的范围查询
3.2 nuber的比较es的number类型的比较比较简单,只要用如下几个方法进行比较即可
代码如下
3.3 date 日期
3.3.1 日期算法 y:年 M:月 w:周 d:天 h:时 m:分 s:秒 /d 四舍五入取最近一天
GET _search
{ "query": { "range" : { "date" : { "gte" : "now-1d/d", "lt" : "now/d" } } }}
3.3.2 时间格式查询
GET search
{ "query": { "range" : { "born" : { "gte": "01/01/2012", "lte": "2013", "format": "dd/MM/yyyy||yyyy" } } }}boolQuery.must(QueryBuilders.rangeQuery("instm").gte(DateUtil.toLocaleString(DateUtil.add(DateUtil.getCurrentTimeIgnoreMills(), Calendar.DAYOFMONTH,
-3),DateUtil.YYYYMMDDHHDDSS))
.lte(DateUtil.getNowTime()).format(DateUtil.YYYYMMDDHHDDSS));
3.3.3 时区查询
GET search
{ "query": { "range" : { "timestamp" : { "gte": "2015-01-01 00:00:00", "lte": "now", "timezone": "+01:00" } } }}boolQuery.must(QueryBuilders.rangeQuery("instm").gte(DateUtil.toLocaleString(DateUtil.add(DateUtil.getCurrentTimeIgnoreMills(), Calendar.DAYOFMONTH,
-3),DateUtil.YYYYMMDDHHDDSS))
.lte(DateUtil.getNowTime()).timeZone(DateUtil.+01:00 ));
4.null查询,空字符查询
1.因为Es是根据索引的方式去查询数据,但是空字符串没有索引,所以空字符串只有在String类型数据未解析(notanalyzed)的情况下能被全文检索。
2.null的检索可以用existsQuery判断字段是否有值
查询为null的字段时配合mustnot使用,判断所以不存在值的字段,代码如下:boolQuery.mustNot(QueryBuilders.existsQuery("name"));
而查询不为空的情况则用must,判断值存在的数据,代码如下:boolQuery.must(QueryBuilders.existsQuery("name"));
5.聚合查询
在mysql中经常会有很多and,or等条件的聚合查询,在ES中must代表and,should代表or。5.1 如果需要表示A=1 and B =2 可以用
"bool" : { "must" : [ { "match" : { "A" : { "query" : 1, } } } ,
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.matchPhrasePrefixQuery("A", 1)); boolQuery.must(QueryBuilders.prefixQuery("A", 2));
5.2 如果需要A=1 or A=2 可以用
"bool" : { "should" : [ { "match" : { "A" : { "query" : 1, } } } ,
"must" : [ { "bool" : { "should" : [ { "bool" : { "must" : [ { "match" : { "A" : { "query" : 1, } } } ], "disablecoord" : false, "adjustpure_negative" : true, "boost" : 1.0 } }, {
},
java 代码
Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
1.模糊查询
在平常的查询中经常有用到模糊查询的情况,而且模糊查询在Es中提供了多种实现的方式:wildcardQuery 通配符查询 中文只能支持关键字查询
prefixQuery 前匹配查询 中文只能支持关键字查询
regexpQuery 正则表达式查询 中文只能支持关键字查询
fuzzyQuery 模糊查询 不支持数字的模糊,中文只能支持单字模糊
2.中文查询
在Es中由于中文的分词方式的影响,上述常见的几种模糊查询的方式都不能完美的支持中文模糊查询的情况。matchPhrasePrefixQuery,matchPhraseQuery则能满足大部分情况下的中文模糊匹配,代码如下
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.should(QueryBuilders.matchPhrasePrefixQuery("name", key));
3.范围查询
RangeQuery:
3.1 如果是String则是关键字范围查询,number/date类型则是大小的范围查询
3.2 nuber的比较es的number类型的比较比较简单,只要用如下几个方法进行比较即可
lte :<=lt : < gte : >= gt : >
代码如下
boolQuery.must(QueryBuilders.rangeQuery("num").gte(1).lte(10);
3.3 date 日期
3.3.1 日期算法 y:年 M:月 w:周 d:天 h:时 m:分 s:秒 /d 四舍五入取最近一天
GET _search
{ "query": { "range" : { "date" : { "gte" : "now-1d/d", "lt" : "now/d" } } }}
3.3.2 时间格式查询
GET search
{ "query": { "range" : { "born" : { "gte": "01/01/2012", "lte": "2013", "format": "dd/MM/yyyy||yyyy" } } }}boolQuery.must(QueryBuilders.rangeQuery("instm").gte(DateUtil.toLocaleString(DateUtil.add(DateUtil.getCurrentTimeIgnoreMills(), Calendar.DAYOFMONTH,
-3),DateUtil.YYYYMMDDHHDDSS))
.lte(DateUtil.getNowTime()).format(DateUtil.YYYYMMDDHHDDSS));
3.3.3 时区查询
GET search
{ "query": { "range" : { "timestamp" : { "gte": "2015-01-01 00:00:00", "lte": "now", "timezone": "+01:00" } } }}boolQuery.must(QueryBuilders.rangeQuery("instm").gte(DateUtil.toLocaleString(DateUtil.add(DateUtil.getCurrentTimeIgnoreMills(), Calendar.DAYOFMONTH,
-3),DateUtil.YYYYMMDDHHDDSS))
.lte(DateUtil.getNowTime()).timeZone(DateUtil.+01:00 ));
4.null查询,空字符查询
1.因为Es是根据索引的方式去查询数据,但是空字符串没有索引,所以空字符串只有在String类型数据未解析(notanalyzed)的情况下能被全文检索。
2.null的检索可以用existsQuery判断字段是否有值
查询为null的字段时配合mustnot使用,判断所以不存在值的字段,代码如下:boolQuery.mustNot(QueryBuilders.existsQuery("name"));
而查询不为空的情况则用must,判断值存在的数据,代码如下:boolQuery.must(QueryBuilders.existsQuery("name"));
5.聚合查询
在mysql中经常会有很多and,or等条件的聚合查询,在ES中must代表and,should代表or。5.1 如果需要表示A=1 and B =2 可以用
"bool" : { "must" : [ { "match" : { "A" : { "query" : 1, } } } ,
{ "B" : { "city_id" : { "query" : 1, } } } ], java代码如下
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.matchPhrasePrefixQuery("A", 1)); boolQuery.must(QueryBuilders.prefixQuery("A", 2));
5.2 如果需要A=1 or A=2 可以用
"bool" : { "should" : [ { "match" : { "A" : { "query" : 1, } } } ,
{ "A" : { "city_id" : { "query" : 1, } } } ],
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.should(QueryBuilders.matchPhrasePrefixQuery("A", 1)); boolQuery.should(QueryBuilders.prefixQuery("A", 2));5.3 如果需要 实现(A=1 or A=2) and C=1
"must" : [ { "bool" : { "should" : [ { "bool" : { "must" : [ { "match" : { "A" : { "query" : 1, } } } ], "disablecoord" : false, "adjustpure_negative" : true, "boost" : 1.0 } }, {
{ "match" : { "A" : { "query" : 2, } } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }, { "match" : { "C" : { "value" : 1, "boost" : 1.0 } } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 }
},
java 代码
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();BoolQueryBuilder cityQuery = QueryBuilders.boolQuery(); cityQuery.should(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("A", 1))); cityQuery.should(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("A", 2))); boolQuery.must(cityQuery); boolQuery.must(QueryBuilders.matchQuery("C", 1) );
相关文章推荐
- day_1_15 JavaWeb系列学习总结之JavaWeb实现分页查询
- Solr学习总结(三)solr查询
- SSM框架系列学习总结1之Spring Ioc
- JQuery学习系列总结—用户名检测
- ZooKeeper学习总结(3)——ZooKeeper常见面试题
- SSM框架系列学习总结3之Spring DAO
- DDRMC 系列总结(2)zz常见硬件术语之内存术语解释
- 控制台 - BRAS系列之爱立信认证服务器用户查询总结
- Nginx学习总结之系列一:《Nginx入门简介》
- 【学习必看】php常见术语总结
- 几种常见DRL(深度强化学习)方法总结与对比之前提基本概念
- Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(1)
- 总结系列_9(Linux下常见使用总结,续...)
- Face Alignment by 3000 FPS系列学习总结(一)
- Lucene学习总结之八:Lucene的查询语法,JavaCC及QueryParser(2)
- Maven学习总结系列六:生命周期和插件
- ELK学习3 启动es常见错误或问题
- Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
- 个人学习C++过程中对const的总结:初始化系列之用字面值常量与其他类型的值初始化的区别(一)
- SSM框架系列学习总结0之IDEA+Maven+SSM整合