由上图看出, QueryBuilder
是整个查询操作的核心,决定了查询什么样的数据和期望得到什么结果这些核心的问题。
QueryBuilder
只是一个接口,需要具体的实体类才可以。那么如何创建 QueryBuilder
的实例呢?有两种方式
- 通过
QueryBuilder
实现类的构造函数 - 使用
QueryBuilders
工具类创建
Building Queries
下面就来看下常用的查询及其 API 有哪些
匹配所有的查询
查询语句如下
GET /_search
{
"query": {
"match_all": {}
}
}
对应的 QueryBuilder
Class 为 MatchAllQueryBuilder
具体方法为 QueryBuilders.matchAllQuery()
全文查询 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
具体方法 : QueryBuilders.matchQuery()
全文查询 API 列表
全部的 API 列表如下(链接均指向 elasticsearch 官网)