elasticsearch - 带有常量分数包装器的 Elasticsearch 布尔查询
问题描述
使用 elasticsearch-7 时,我对 es 复合查询语法感到困惑。
虽然反复阅读 es 文档,但我只是分别找到布尔或常量分数的标准语法。
正如它所阐明的那样,我了解什么是“查询上下文”和什么是“过滤上下文”。但是当将这两种查询类型组合在一个查询中时,我不知道它是什么意思。
让我们看一个例子:
GET /classes_test/_search
{
"size": "21",
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"match": {
"class_name": "29386556"
}
}
],
"should": [
{
"term": {
"master": "7033560"
}
},
{
"term": {
"assistant": "7033560"
}
},
{
"term": {
"students": "7033560"
}
}
],
"minimum_should_match": 1,
"must_not": [
{
"term": {
"class_id": 0
}
}
],
"filter": [
{
"term": {
"class_status": "1"
}
}
]
}
}
}
}
}
这个查询可以很好地执行和响应。响应内容中的每个项目都有一个 '_score' 值,值为 1.0。
那么,这是否意味着 sub bool 查询作为一个整体处于过滤器上下文中,尽管它具有“必须”和“应该”?
我还发现布尔查询可以有一个恒定分数子查询。
为什么 es 允许这些语法但没有更多的词可以解释?
解决方案
如果您使用constant_score
查询,您将永远不会得到不同于 1.0 的分数,除非您指定boost
参数,在这种情况下分数将匹配这些参数。
如果你需要得分,你显然需要放弃constant_score
。
在您的情况下,您的match
查询class_name
不能产生除 1 或 0 以外的任何其他分数,因为这基本上是一个是/否过滤器,而不是基于全文搜索的匹配。
总而言之,您的所有查询都在过滤器上下文中执行(因此得分为 0 或 1),因为您不依赖全文搜索。因此,每当您使用全文搜索时,您都会获得评分,而不是因为您使用match
查询。在您的情况下,您可以将所有must
约束合并到filter
中,这不会有任何区别,因为您只有过滤器(是/否匹配)并且没有全文搜索。
推荐阅读
- node.js - 数据验证嵌套 js 不适用于扩展文档类
- c - crc 8 函数的两个结果相加
- c - 如何在我的代码中找到括号匹配问题的错误?(C语言)
- java - 将JsonObject中的单个字符串/日期反序列化为java中的字符串
- node.js - 通过node js从cpanel中的FTP帐户/文件夹获取图像并显示在react js上
- python - 点击屋。使用 python 模块 clickhouse_driver 的问题
- sql - 为每个组生成一个随机数并将其分配给组中的所有行
- python - 多个 Kivy 下拉列表奇怪的错误
- python - 我无法在 Python Selenium 中抓取 HTML 页面源中存在的元素?
- ios - 无法超越带有嵌套导航链接的第二页