查询和过滤器上下文
查询由查询子句组成,这些子句可以在筛选上下文或查询上下文中运行。筛选上下文中的查询子句会提出“文档是否与查询子句匹配?”的问题,并返回匹配的文档。查询上下文中的查询子句会提出“文档与查询子句匹配得多好?”的问题,返回匹配的文档,并以相关性得分的形式提供每个文档的相关性。
相关性得分
相关性得分衡量文档与查询的匹配程度。它是一个正浮点数,OpenSearch 将其记录在每个文档的_score
元数据字段中。
"hits" : [
{
"_index" : "shakespeare",
"_id" : "32437",
"_score" : 18.781435,
"_source" : {
"type" : "line",
"line_id" : 32438,
"play_name" : "Hamlet",
"speech_number" : 3,
"line_number" : "1.1.3",
"speaker" : "BERNARDO",
"text_entry" : "Long live the king!"
}
},
...
分数越高表示文档越相关。虽然不同的查询类型计算相关性得分的方式不同,但所有查询类型都会考虑查询子句是在筛选上下文还是查询上下文运行。
将您希望影响相关性得分的查询子句用在查询上下文中,而将所有其他查询子句用在筛选上下文中。
筛选上下文
筛选上下文中的查询子句会提出“文档是否与查询子句匹配?”的问题,其答案为二进制(是/否)。例如,如果您有一个包含学生数据的索引,您可以使用筛选上下文来回答关于学生的以下问题:
- 学生的
honors
状态是否设置为true
? - 学生的
graduation_year
是否在 2020–2022 年范围内?
在筛选上下文中,OpenSearch 返回匹配的文档,但不计算相关性得分。因此,您应该对具有精确值的字段使用筛选上下文。
要在筛选上下文中运行查询子句,请将其传递给filter
参数。例如,以下布尔查询搜索在 2020–2022 年以优异成绩毕业的学生:
GET students/_search
{
"query": {
"bool": {
"filter": [
{ "term": { "honors": true }},
{ "range": { "graduation_year": { "gte": 2020, "lte": 2022 }}}
]
}
}
}
为了提高性能,OpenSearch 会缓存常用筛选器。
查询上下文
查询上下文中的查询子句会提出“文档与查询子句匹配得多好?”的问题,其答案并非二进制。查询上下文适用于全文搜索,您不仅希望接收匹配的文档,还希望确定每个文档的相关性。例如,如果您有一个包含莎士比亚全集作品的索引,您可以使用查询上下文进行以下搜索:
- 查找包含单词
dream
的文档,包括其各种形式(dreaming
或dreams
)和同义词(contemplate
)。 - 查找匹配词语
long live king
的文档。
在查询上下文中,每个匹配的文档都在_score
字段中包含一个相关性得分,您可以使用它来按相关性排序文档。
要在查询上下文中运行查询子句,请将其传递给query
参数。例如,以下查询在shakespeare
索引中搜索匹配词语long live king
的文档:
GET shakespeare/_search
{
"query": {
"match": {
"text_entry": "long live king"
}
}
}
相关性得分是具有 24 位有效数字精度的单精度浮点数。如果得分计算超出有效数字精度,可能会发生精度损失。