我在ElasticSearch 0.9中有一个索引,其中包含以下文档:

{"Id":1, "Title":"Hello World" , "Popularity":1},

{"Id":2, "Title":"Hello World" , "Popularity":3},

{"Id":3, "Title":"Hello" , "Popularity":10}

如您所见,前两个文档具有相同的 Headers 文本但不同的流行度值 . 现在我使用简单的评分脚本对Title属性进行模糊搜索:

评分脚本:“_score * doc ['Popularity'] . value”

我的查询是这样的:

{
  "query": {
    "custom_score": {
      "lang": "mvel",
      "script": "_score * doc['Popularity'].value",
      "query": {
        "fuzzy": {
          "Title": {
            "value": "Hello World",
            "fuzziness": 3
          }
        }
      }
    }
  }
}

现在发生的是第三个文档(其Id等于3)仅仅因为它具有更高的流行度而成为搜索结果的顶部 . 换句话说,评分功能完全覆盖了搜索结果的相关性 . 虽然我希望在顶部看到更相关的文档(Id = 1和2),因为它们与搜索词(更短的距离)更相关,然后在两个顶级搜索结果之间,评分函数以更高的受欢迎程度提升文档值 . 所以结果我希望是这样的:

{"Id":2, "Title":"Hello World" , "Popularity":3}
{"Id":1, "Title":"Hello World" , "Popularity":1}
{"Id":3, "Title":"Hello" , "Popularity":10}

作为一个真实世界的例子,我们有一个音乐商店,顶部有一个搜索栏 . 用户可以输入诸如“蓝色”之类的关键字,然后将有数十个 Headers 为“蓝色”的音乐曲目和一些接近搜索时间的音乐曲目(例如“BlueSky”) . 每个曲目都有一个受欢迎的属性,但是我们希望看到 Headers 为“蓝色”的所有曲目,即使是 Headers 为“BlueSky”的曲目也因为用户更喜欢首先看到完全匹配而具有更高的受欢迎程度 . 然后那些 Headers 正好是“蓝色”的人必须按评分脚本排名 .

有人可以指导我如何更新我的查询,以便相关结果(无论得分)仍然到达结果列表的顶部,然后其中得分提升更受欢迎的?