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();