目录html
子曰,温故而知新,能够为师也。学习的过程就是不断的回顾,总结,总结,再总结。首先,一块儿来回顾下上篇 search API中的内容。
为了可以更透彻的理解 rest client search API 的使用,我专门整理了相关对象之间的关系图,一块儿来看下。java
由上图看出, QueryBuilder
是整个查询操做的核心,决定了查询什么样的数据和指望获得什么结果这些核心的问题。正则表达式
QueryBuilder
只是一个接口,须要具体的实体类才能够。那么如何建立 QueryBuilder
的实例呢?有两种方式算法
QueryBuilder
实现类的构造函数QueryBuilders
工具类建立下面就来看下经常使用的查询及其 API 有哪些shell
查询语句以下json
GET /_search { "query": { "match_all": {} } }
对应的 QueryBuilder
Class 为 MatchAllQueryBuilder
api
具体方法为 QueryBuilders.matchAllQuery()app
像使用 match
或者 query_string
这样的高层查询都属于全文查询,elasticsearch
date
) 或整数(integer
) 字段,会将查询字符串分别做为日期或整数对待。not_analyzed
)未分析的精确值字符串字段,会将整个查询字符串做为单个词项对待。analyzed
)已分析的全文字段,会先将查询字符串传递到一个合适的分析器,而后生成一个供查询的词项列表组成了词项列表,后面就会对每一个词项逐一执行底层查询,将查询结果合并,而且为每一个文档生成最终的相关度评分。ide
match
查询的单个词的步骤是什么?analyzed
, not_analyzed
match
查询在执行时就会是单个底层的 term
查询match
查询能够接受 text/numeric/dates 格式的参数,分析,并构建一个查询。
GET /_search { "query": { "match" : { "message" : "this is a test" } } }
上面的实例中 message
是一个字段名。
对应的 QueryBuilder
class : MatchQueryBuilder
具体方法 : QueryBuilders.matchQuery()
所有的 API 列表以下(连接均指向 elasticsearch 官网)
这种类型的查询不须要分析,它们是对单个词项操做,只是在倒排索引中查找准确的词项(精确匹配)而且使用 TF/IDF 算法为每一个包含词项的文档计算相关度评分 _score
。
term
查询可用做精确值匹配,精确值的类型则能够是数字,时间,布尔类型,或者是那些 not_analyzed 的字符串。
对应的 QueryBuilder
class 是TermQueryBuilder
具体方法是 QueryBuilders.termQuery()
terms
查询容许指定多个值进行匹配。若是这个字段包含了指定值中的任何一个值,就表示该文档知足条件。
对应的 QueryBuilder
class 是 TermsQueryBuilder
具体方法是 QueryBuilders.termsQuery()
wildcard
通配符查询是一种底层基于词的查询,它容许指定匹配的正则表达式。并且它使用的是标准的 shell 通配符查询:
?
匹配任意字符*
匹配 0 个或多个字符wildcard
须要扫描倒排索引中的词列表才能找到全部匹配的词,而后依次获取每一个词相关的文档 ID。
因为通配符和正则表达式只能在查询时才能完成,所以查询效率会比较低,在须要高性能的场合,应当谨慎使用。
对应的 QueryBuilder
class 是 WildcardQueryBuilder
具体方法是 QueryBuilders.wildcardQuery()
复合查询会将其余的复合查询或者叶查询包裹起来,以嵌套的形式展现和执行,获得的结果也是对各个子查询结果和分数的合并。能够分为下面几种:
常常用在使用 filter 的场合,全部匹配的文档分数都是一个不变的常量
能够将多个叶查询和组合查询再组合起来,可接受的参数以下
must_not
文档必须不匹配才能被包含进来should
若是知足其中的任何语句,都会增长分数;即便不知足,也没有影响filter
以过滤模式进行,不评分,可是必须匹配叫作分离最大化查询,它会将任何与查询匹配的文档都做为结果返回,可是只是将其中最佳匹配的评分做为最终的评分返回。
容许为每一个与主查询匹配的文档应用一个函数,可用来改变甚至替换原始的评分
用来控制(提升或下降)复合查询中子查询的权重。
这里比较重要的一个是 Wrapper Query,是说能够接受任何其余 base64 编码的字符串做为子查询。
主要应用场合就是在 Rest High-Level REST client 中接受 json 字符串做为参数。好比使用 gson 等 json 库将要查询的语句拼接好,直接塞到 Wrapper Query 中查询就能够了,很是方便。
Wrapper Query 对应的 QueryBuilder
class 是WrapperQueryBuilder
具体方法是 QueryBuilders.wrapperQuery()
本文对 elasticsearch rest high client 中的查询构建进行了总结和整理,对经常使用的 API 作了简要的介绍。读者若是要查看完整的构建查询的 API 列表,可参考此处