当前位置: 首页 > 知识库问答 >
问题:

在Elasticsearch中仅提升分数接近相同的结果

方和顺
2023-03-14

我使用下面的查询搜索姓名数据库,允许模糊匹配,但优先选择精确匹配。

"query": {
    "bool": {
        "should": [
            {
                "match": {
                    "name": {
                        "query": "x",
                        "operator": "and",
                        "boost": 10
                    }
                }
            },
            {
                "match": {
                    "name": {
                        "query": "x",
                        "fuzziness": "AUTO",
                        "operator": "and"
                    }
                }
            },
            {
                "match": {
                    "altname": {
                        "query": "x",
                        "fuzziness": "AUTO",
                        "operator": "and"
                    }
                }
            }
        ]
    }
}

数据库包含同名条目。如果发生这种情况,我想增加第二个字段,我们称之为< code>weight。但是,我只希望提升应用于得分(接近)相同的结果子集之间,而不是所有结果。

由于altname字段上的相关性会影响具有相同名称的结果可能会获得略有不同的分数,这使得情况更加复杂。

例如,查询dog可能会得到3个结果:

    < li >狗[id 1,得分2.3,体重10] < li >狗[id 2,得分2.2,体重20] < li>Doge [id 3,得分1,体重100]

我在寻找一个将id为2的结果提升到最高分的查询。id为3的结果应该总是停留在底部,因为它的相关性很差,不管它的权重如何。理想的是用可调参数来调整分数因子与权重因子。

在Elasticsearch中,有什么方法可以在不破坏性能的情况下一次性完成这项任务吗?

共有1个答案

潘灵均
2023-03-14

看来我想通了。

首先,我意识到我最初问题中的例子比必要的要复杂得多。我将其缩小到:“如何编写'blub'查询,该查询按顺序2,3,1返回以下文档”

id: 1
name: blub
weight: 0.01
---
id: 2
name: blub
weight: 0.1
---
id: 3
name: blub stuff
weight: 1

因此:对于具有相同(或非常相似)分数的两个文档,权重应该用作平局决胜。但是分数明显较低的文档不应该被允许胜过其他结果,不管它们的权重如何。

我在出色的Play工具中加载了数据:https://www.found.no/play/gist/edd93c69c015d4c62366#search 并开始实验。

调出log2p修饰符的结果正好符合我的预期。在真实数据集上重复它,一切看起来都与预期完全一样。

function_score: 
    query:
        match:
            name: blub
    field_value_factor:
        field: weight
        modifier: log2p
 类似资料:
  • 需要在ElasticSearch中找到一种方法,以基于某个字段的特定值来提高文档的相关性。具体地说,在我的所有文档中都有一个特殊的字段,该字段值越高,包含该字段的文档就越相关,无论搜索如何。 考虑以下文档结构: 我希望具有较高boosting_field值的文档在本质上比具有较低boosting_field值的文档更相关。这只是一个起点--在确定搜索中每个文档的最终相关性得分时,还将考虑查询与其他

  • 我正在制作一个基于ElasticSearch的电子商务产品目录原型。每个产品都作为文档编制索引(包含名称和描述等属性)。 有一件事我不能解决,我想根据用户的购买历史提高某些产品的分数。 我能想到的唯一选择是将购买历史记录存储为产品的子文档。然后使用custom\u filters\u score和过滤器,该过滤器查找具有给定用户ID的子文档。在这种情况下,过滤器确定给定的产品是否已被给定的用户购买

  • 问题内容: 我想根据数字与查询的接近程度对文档进行评分。由于我有两个文件和,查询 然后我想。换句话说,我想要类似针对数字的模糊查询。我将如何实现?用例是我想支持价格查询(精确或范围),但想对不在边界内的商品进行排名。 问题答案: 可以使用custom_score查询来实现,其中脚本将根据确切价格与所需价格之间的差的绝对值确定提升。期望的价格应作为参数传递给脚本,以避免针对每个请求重新编译脚本。 另

  • "在Elasticsearch中设计索引以便" 我们如何使Elasticsearch返回相同的结果,无论搜索是否使用"and"作为查询字符串或&" 例如,有一个查询来查找包含“和/”的所有电影标题 先生。 所以在这种情况下,搜索是否用“和”或“ 从我的Kibana开发工具中转储 放置测试索引{“设置”:{“副本的数量”:0,“碎片的数量”:1},“映射”:{“文档”:{“属性”:{“电影名称”:{

  • 问题内容: 例如,如果某个东西的“ favourites_count”值更高,我希望它变得更相关,或者如果它最近更新,那么它就更有意义。有没有办法做到这一点?这与标准的boost功能不同,因为这些字段不包含关键字,而是包含数字值。 问题答案: 您可以使用来基于自定义公式增强文档。有关更多详细信息,请参见此处(部分):https : //www.elastic.co/guide/zh- cn/ela

  • 问题内容: 在我的elasticsearch索引“ people”中,包含以下文件: 我想得到一个文档的结果,该文档的分区为2或1,但是最多只能包含2个。因此,如果以上是我的整个索引,我希望它返回: 用Elastic中的单个查询是否可以实现此目标?非常感谢您的帮助! 问题答案: 这样的事情应该做到: