我在ElasticSearch 0.9中有一个索引,其中包含以下文档:
{"Id":1, "Title":"Hello World" , "Popularity":1},
{"Id":2, "Title":"Hello World" , "Popularity":3},
{"Id":3, "Title":"Hello" , "Popularity":10}
如您所见,前两个文档具有相同的标题文本但不同的受欢迎度值。现在我使用简单的评分脚本对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}
作为一个真实世界的例子,我们有一个音乐商店,顶部有一个搜索栏。用户可以输入关键字,例如" Blue"然后会有数十首音乐曲目的标题是" Blue"和其他一些接近搜索时间的东西(例如" BlueSky")。每个曲目都有一个受欢迎的属性,但是我们希望看到所有标题为" Blue"在顶部甚至是标题为" BlueSky"因为用户更喜欢先看到完全匹配,所以人气较高。然后那些标题正是"蓝"必须按评分脚本排名。
有人可以指导我如何更新我的查询,以便相关结果(无论得分)是否仍然位于结果列表的顶部,然后其中得分提升了更受欢迎的结果?