1.Elasticsearch Query 的两种类型
Leaf query clauses:Leaf query clauses 在特定字段中查找特定值,例如 match , term 或 range 查询。 这些查询可以供它们自己使用。
Compound query clauses:Compound query clauses 包装其他 Leaf 或 Compound query clauses,并用于以逻辑方式组合多个查询(例如 bool 或 dis_max 查询),或更改其行为(例如 constant_score 查询)。
查询子句的行为会有所不同,具体取决于它们是在 query context 中还是在 filter context 中使用。
2.relevance score
默认情况下,Elasticsearch 按 relevance score 对匹配的搜索结果进行排序,该得分衡量每个文档与查询的匹配程度。
relevance score 是一个正浮点数,在搜索 API 的 _score 元字段中返回。 _score 越高,文档越相关。 虽然每种查询类型可以用不同的方式计算相关性分数,但是分数计算还取决于查询子句是在 query context 中还是在 filter context 中运行。
3.Query context
在 query context 中,查询子句回答 “此文档与该查询子句的匹配程度如何” 的问题。除了确定文档是否匹配外,查询子句还计算 _score 元字段中的相关性得分。
每当将查询子句传递到 query 参数(例如 search API 中的 query 参数)时,query context 即生效。
4.Filter context
在 filter context 中,查询子句回答问题 “此文档是否与此查询子句匹配?” 答案是简单的 “是” 或 “否” ,即不计算分数。 filter context 主要用于过滤结构化数据,例如
此时间戳记是否在2015年到2016年之间?
状态字段设置为“已发布”吗?
常用的 filter 将由 Elasticsearch 自动缓存,以提高性能。
每当将查询子句传递到 filter 参数(例如 bool 查询中的 filter 或 must_not 参数,constant_score 查询中的 filter 参数或 filter 聚合)时,filter context context 即生效。
5.Example of query and filter contexts
以下是在 search API 的 query and filter context 中使用的查询子句的示例。 此查询将匹配满足以下所有条件的文档:
title 字段包含单词 searach 。
content 字段包含单词 elasticsearch 。
status 字段包含精确的单词 published 。
publish_date 字段包含从2015年1月1日开始的日期。
在 kibana 终端执行:
GET /_search
{
"query": { 1
"bool": { 2
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [ 3
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
1.query 参数是指 query context。
2.bool 和两个 match 子句用于 query context ,这意味着它们用于对每个文档的匹配程度进行评分。
3.filter 参数是指 filter context 。 其 term 和 range 子句用于 filter context 。 它们将过滤出不匹配的文档,但不会影响匹配文档的分数。
6.WARNING
在 query context 中为查询计算的分数表示为单精度 floating 数; 它们只有 24 位才能表示有效的精度。 超过有效位数的分数计算将被转换为 floats 而失去精度。
7.TIP
在 query context 中使用查询子句来确定会影响匹配文档得分的条件(即文档匹配程度),所有其他查询子句则在 filter context 中使用。