es-query-DSL学习总结

es的检索分为query和filter

query关心的score,即查询结果与检索条件的相关度

filter关心yes or no,关心是匹配的是与否,因此不会参与score相关的计算

图中的左侧是filter的主要特性,右侧是query相关的主要查询,比较高级的检索目前掌握不熟练,用的也少,没有列出

按照层次分为符合查询(compound query),全文检索(full text query),叶子查询(term-level query),可以简单记为字段查询或词元查询

其中全文检索主要体现在分词上,因此需要掌握上一个篇章的analysis模块中的 _analyze接口分析分词的结果

  •  match查询的过程

1、检查字段类型,查看字段是 analyzed, not_analyzed
2、分析查询字符串,如果只有一个单词项, match 查询在执行时就会是单个底层的 term 查询
3、查找匹配的文档,会在倒排索引中查找匹配文档,然后获取一组包含该项的文档
4、为每个文档评分

  • java API

如果对DSL以及上述查询的关键词比较熟悉,只需要弄清这几个类,所有的检索和聚合的框架就都很清晰了

1、 RestHighLevelClient-------注入一个client

2、 SearchRequest       -------构建一个request

3、 SearchSourceBuilder   --构建一个sourceBuilder

4、 AggregationBuilder和QueryBuilder----构建一个检索或聚合的Builder

  • 和关系型数据库查询的对比

一般查询:=、>、>=、<、<= 、or、and、in、like、count、sum、group by、order by、limit
1、连接符 or(should) and(must)
and:    boolQueryBuilder.must(QueryBuilders.termQuery("isDel",1));
or:       boolQueryBuilder.should(QueryBuilders.termQuery("caseStatus",s));

2、比较查询
=:       QueryBuilders.termQuery("isDel",1));
范围:QueryBuilders.rangeQuery("overdueStartTime").lte(startDate.getTime())
<=      lte
<        lt
>=     gte
>       gt

3、in查询------termsQuery
QueryBuilders.termsQuery("id",idList)

4、like查询------wildcardQuery,matchPhraseQuery,matchQuery
QueryBuilders.wildcardQuery("phone", "*" + phoneNumber+ "*")
QueryBuilders.matchPhraseQuery("name", name)

5、orderby 和limit
SearchResponse searchResponse = client.prepareSearch(INDEX)
.setTypes(TYPE)
.setQuery(boolQueryBuilder)
//指定查询字段
.addStoredField("id")
.addSort(order, sortOrder)
.setFrom((currentPage - 1) * limit).setSize(limit)
.execute()
.actionGet();

posted @ 2020-09-30 17:35  鼠标的博客  阅读(614)  评论(0编辑  收藏  举报