Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries

上篇回顾

子曰,温故而知新,可以为师也。学习的过程就是不断的回顾,总结,总结,再总结。首先,一起来回顾下上篇 search API中的内容。
为了能够更透彻的理解 rest client search API 的使用,我专门整理了相关对象之间的关系图,一起来看下。

search API 关系图

由上图看出, QueryBuilder 是整个查询操作的核心,决定了查询什么样的数据和期望得到什么结果这些核心的问题。

QueryBuilder 只是一个接口,需要具体的实体类才可以。那么如何创建 QueryBuilder 的实例呢?有两种方式

通过 QueryBuilder 实现类的构造函数

使用 QueryBuilders 工具类创建

Building Queries

该部分只列出了笔者常用的查询,这些查询都是使用它们对应的 QueryBuilder 的实现类完成的。

匹配所有的查询

查询语句如下

GET /_search { "query": { "match_all": {} } }

对应的 QueryBuilder Class 为 MatchAllQueryBuilder

具体方法为

全文查询 Full Text Queries 什么是全文查询?

像使用 match 或者 query_string 这样的高层查询都属于全文查询,

查询 日期(date) 或整数(integer) 字段,会将查询字符串分别作为日期或整数对待。

查询一个( not_analyzed )未分析的精确值字符串字段,会将整个查询字符串作为单个词项对待。

查询一个( analyzed )已分析的全文字段,会先将查询字符串传递到一个合适的分析器,然后生成一个供查询的词项列表

组成了词项列表,后面就会对每个词项逐一执行底层查询,将查询结果合并,并且为每个文档生成最终的相关度评分。

Match match 查询的单个词的步骤是什么?

检查字段类型,查看字段是 analyzed, not_analyzed

分析查询字符串,如果只有一个单词项, match 查询在执行时就会是单个底层的 term 查询

查找匹配的文档,会在倒排索引中查找匹配文档,然后获取一组包含该项的文档

为每个文档评分

构建 Match 查询

match 查询可以接受 text/numeric/dates 格式的参数,分析,并构建一个查询。

GET /_search { "query": { "match" : { "message" : "this is a test" } } }

上面的实例中 message 是一个字段名。

对应的 QueryBuilder class : MatchQueryBuilder

具体方法 :

全文查询 API 列表

全部的 API 列表如下(链接均指向 elasticsearch 官网)

Search Query QueryBuilder Class Method in QueryBuilders
Match   MatchQueryBuilder    
Match Phrase   MatchPhraseQueryBuilder    
Match Phrase Prefix   MatchPhrasePrefixQueryBuilder    
Multi Match   MultiMatchQueryBuilder    
Common Terms   CommonTermsQueryBuilder    
Query String   QueryStringQueryBuilder    
Simple Query String   SimpleQueryStringBuilder    
基于词项的查询

这种类型的查询不需要分析,它们是对单个词项操作,只是在倒排索引中查找准确的词项(精确匹配)并且使用 TF/IDF 算法为每个包含词项的文档计算相关度评分 _score。

Term

term 查询可用作精确值匹配,精确值的类型则可以是数字,时间,布尔类型,或者是那些 not_analyzed 的字符串。

对应的 QueryBuilder class 是TermQueryBuilder

具体方法是

Terms

terms 查询允许指定多个值进行匹配。如果这个字段包含了指定值中的任何一个值,就表示该文档满足条件。

对应的 QueryBuilder class 是 TermsQueryBuilder

具体方法是

Wildcard

wildcard 通配符查询是一种底层基于词的查询,它允许指定匹配的正则表达式。而且它使用的是标准的 shell 通配符查询:

? 匹配任意字符

* 匹配 0 个或多个字符

wildcard 需要扫描倒排索引中的词列表才能找到所有匹配的词,然后依次获取每个词相关的文档 ID。

由于通配符和正则表达式只能在查询时才能完成,因此查询效率会比较低,在需要高性能的场合,应当谨慎使用。

对应的 QueryBuilder class 是 WildcardQueryBuilder

具体方法是

基于词项 API 列表 Search Query QueryBuilder Class Method in QueryBuilders
Term   TermQueryBuilder    
Terms   TermsQueryBuilder    
Range   RangeQueryBuilder    
Exists   ExistsQueryBuilder    
Prefix   PrefixQueryBuilder    
Wildcard   WildcardQueryBuilder    
Regexp   RegexpQueryBuilder    
Fuzzy   FuzzyQueryBuilder    
Type   TypeQueryBuilder    
Ids   IdsQueryBuilder    
复合查询 什么是复合查询?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydsdz.html