0

我通过过滤和使用布尔查询来应用分数来检索文档。例如:

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "color": "Yellow"
          }
        },
        {
          "term": {
            "color": "Red"
          }
        },

        {
          "term": {
            "color": "Blue"
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

如果数据只有“黄色”,它会给我“1.5”的分数,但如果数据只有“红色”,它会给我“1.4”的分数。我希望分数是一样的。每个数据只有 1 个匹配项,为什么分数不同?应该查询中有什么可以忽略术语的顺序吗?当我只有 1 场比赛时,“黄色”的比赛总是会获得高分......

更新:问题不是应该数组中的术语顺序,而是“包含该术语的文档数量”

4

3 回答 3

0

如果评分对您不重要,您可以将filter子句与子句一起使用bool/should

过滤上下文避免了评分部分,是一个正常的是/否查询。因此,匹配文档的分数将始终为 0.0

{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "should": [
            {
              "term": {
                "color.keyword": "Yellow"
              }
            },
            {
              "term": {
                "color.keyword": "Black"
              }
            },
            {
              "term": {
                "color.keyword": "Purple"
              }
            }
          ],
          "minimum_should_match": 1
        }
      }
    }
  }
} 

匹配文档的分数取决于几个因素,例如字段长度、术语频率、文档总数等。

您可以通过解释 API了解更多关于如何计算分数的信息

GET /_search?explain=true
于 2021-06-03T14:44:21.010 回答
0

@ESCoder 使用上面的示例我有:

“黄色”

{
                      "value" : 1.5995531,
                      "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                      "details" : [
                        {
                          "value" : 30,
                          "description" : "n, number of documents containing term",
                          "details" : [ ]
                        },
                        {
                          "value" : 150,
                          "description" : "N, total number of documents with field",
                          "details" : [ ]
                        }
                      ]
                    },

“红色的”

{
                      "value" : 1.0375981,
                      "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                      "details" : [
                        {
                          "value" : 53,
                          "description" : "n, number of documents containing term",
                          "details" : [ ]
                        },
                        {
                          "value" : 150,
                          "description" : "N, total number of documents with field",
                          "details" : [ ]
                        }
                      ]
                    },

每一个(红色和黄色)在每个文档中只出现一次。如果有红色或黄色,我想获得相同的分数。我不在乎每个人有多少文件。如果一个文件只有黄色而另一个文件只有红色,我希望两者的分数相同。可能吗?

于 2021-06-04T09:12:58.530 回答
0

像其他人提到的 - 分数取决于许多因素。但是,如果您想忽略所有这些,constant_score如果文档与特定术语匹配,您可以使用分配一致的分数,例如:

{
  "query": {
    "bool": {
      "should": [
        {
          "constant_score": {
            "filter": {
              "term": {
                "color": "Yellow"
              }
            },
            "boost": 1
          }
        },
        {
          "constant_score": {
            "filter": {
              "term": {
                "color": "Red"
              }
            },
            "boost": 1
          }
        },
        {
          "constant_score": {
            "filter": {
              "term": {
                "color": "Blue"
              }
            },
            "boost": 1
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

我相信这应该满足您的要求。

于 2021-06-04T09:23:04.467 回答