弹性搜索根据字段值的计数提高相关性



我正在尝试根据字段值的计数来提高相关性。字段值的计数越少,相关性越高。

例如,我有 1001 个文档。1000 个文档由 John 撰写,只有一个文档由 Joe 编写。

// 1000 documents by John
{"title": "abc 1", "author": "John"}
{"title": "abc 2", "author": "John"}
// ...
{"title": "abc 1000", "author": "John"}
// 1 document by Joe
{"title": "abc 1", "author": "Joe"}

当我在标题字段中搜索"abc"时,我会得到 1001 个文档。如果这些文档不完全相同,它们应该具有非常相似的相关性分数。字段值"John"的计数为 1000,字段值"Joe"的计数为 1。现在,我想提高文档的相关性{"title": "abc 1", "author": "Joe"},否则,很难看到作者乔的文档。

谢谢!

如果有人遇到相同的用例,我将使用函数分数查询来解释我的解决方法。这种方式至少会对 Elasticsearch 服务器进行两次调用。

  1. 获取每个人的计数(您可以使用聚合功能(。在我们的示例中,我们从 John 那里得到 1000,从 Joe 那里得到 1
  2. 根据计数生成权重。计数越多,相关性权重越小。有点像约翰的1 + sqrt(1/1000)和乔的1 + sqrt(1/1)
  3. 使用脚本中的权重根据作者值计算分数(脚本可以好很多(:

    {
    "query": {
    "function_score": {
    "query": {
    "match": { "title": "abc" }
    },
    "script_score" : {
    "script" : {
    "inline": "if (doc['author'].value == 'John') {return (1 + sqrt(1/1000)) * _score}n return (1 + sqrt(1/1)) * _score;"
    }
    }
    }
    }
    }
    

相关内容

  • 没有找到相关文章

最新更新