布尔查询何时计算分数?

时间:2019-07-10 12:59:43

标签: elasticsearch

我使用轻松的脚本对布尔查询中的文档进行评分。我需要对布尔查询的每个“必须”子句进行不同的评分。

所以我有两个选择:

  1. 我将每个必须查询都包装在script_score中,以便为每个子查询使用不同的脚本
  2. 我将整个布尔查询都包装在脚本分数中,因此必须使用唯一的脚本。意思是我必须将此脚本作为我想要的评分类型的参数,并在脚本中添加if子句

选项1看起来像这样:

GET /_search
{
  "source": {
    "query": {
      "script_score": {
        "query": {
          "bool": {
            "must": [
              {*subquery1_here*},
              {*subquery2_here*}
            ]
          }
        },
        "script": {
          "id": "universal_script",
          "params": {
            "query": ["{{subquery1-params}}", "{{subquery2-params}}"],
            "score-type": ["{{subquery1-score_type}}", "{{subquery2-score_type}}"]
          }
        }
      }
    }
  }
}

选项2看起来像这样:

GET /_search
{
  "source": {
    "query": {
      "bool": {
        "must": [
          {
            "script_score": {
              "query": {*field1_subquery_here*}  
              },
              "script": {
                "id": "script-1",
                "params": {
                  "query": "{{subquery1-params}}"
                }
              }
            }
          },
          {
            "script_score": {
              "query": {*field2_subquery_here*}  
              },
              "script": {
                "id": "script-2",
                "params": {
                  "query": "{{subquery2-params}}"
                }
              }
            }
          }
        ]
      }
    }
  }
}

我希望选择2,但是我想知道它是否需要更多的计算能力?

我对选项2的担心是,Elastic将独立运行每个script_score并得分与给定脚本的所有匹配项。然后将运行布尔查询,仅获取与两个子查询都匹配的文档。 这将很糟糕,因为评分脚本将比option1在更多文档上执行。

所以这就是为什么我想知道bool查询中的分数是什么时候计算出来的?

0 个答案:

没有答案