【问题标题】:Manipulate score in elasticsearch在弹性搜索中操纵分数
【发布时间】:2015-12-29 09:17:03
【问题描述】:

我想操纵我在 elasticsearch 上进行搜索时得到的分数。 我已经使用了 boost 选项,但它并没有给我想要的结果。经过一番阅读,我认为 function_score 查询是我的问题的解决方案。 我了解它的工作原理,但我不知道如何更改当前查询以将其与 function_score 查询一起使用。

"query": {
"filtered": {
    "query": {
        "bool": {
            "should": [{
                "multi_match": {
                    "type": "most_fields",
                    "query": "paus",
                    "operator": "and",
                    "boost": 2,
                    "fields": [
                        "fullname^2",
                        "fullname.folded",
                        "alias^2",
                        "name^2"
                    ],
                    "fuzziness": 0
                }
            }, {
                "multi_match": {
                    "type": "most_fields",
                    "query": "paus",
                    "operator": "and",
                    "boost": 1.9,
                    "fields": [
                        "taggings.tag.name^1.9",
                        "function",
                        "relations.master.name^1.9",
                        "relations.master.first_name^1.9",
                        "relations.master.last_name^1.9",
                        "relations.slave.name^1.9",
                        "relations.slave.first_name^1.9",
                        "relations.slave.last_name^1.9"
                    ],
                    "fuzziness": 0
                }
            }, {
                "multi_match": {
                    "type": "most_fields",
                    "query": "paus",
                    "operator": "and",
                    "fields": [
                        "fullname",
                        "alias",
                        "name"
                    ],
                    "boost": 0.2,
                    "fuzziness": 1
                }
            }, {
                "match": {
                    "extra": {
                        "query": "paus",
                        "fuzziness": 0,
                        "boost": 0.1
                    }
                }
            }]
        }
    },
    "filter": {
        "bool": {
            "must": [
                {
                    "terms": {
                        "type": ["Person"]
                    }
                },
                {
                    "term": {
                        "deleted": false
                    }
                }
            ]
        }
    }
}

如您所见,我们有四种匹配项。

  • Boost 2:当名称完全匹配时
  • Boost 1.9:当标签上有完全匹配时
  • Boost 0.2:当名称匹配但有一个字符写错时
  • Boost 0.1:当额外(描述)字段中有匹配项时

我面临的问题是一个字符写错并且没有标记的匹配分数高于带有正确标记和整个单词写错的匹配。那应该是另一种方式...

任何帮助将不胜感激:)

【问题讨论】:

    标签: elasticsearch tags solr-boost


    【解决方案1】:

    对此没有明确的答案。你最好的朋友是Explain API,它会告诉你每个文档的score是如何计算的。

    要记住的最重要的事情是boost 只是计算分数时考虑的因素之一。来自Docs

    实际上,没有简单的公式可以确定特定查询子句的“正确”提升值。这是一个试试看的问题。请记住,提升只是相关性得分中涉及的因素之一;它必须与其他因素

    竞争

    如果您通过TheoryLucene's Practical Scoring Function 将会对您有很大帮助。这是Lucene使用的公式。

    score(q,d)  =  
                queryNorm(q)  
              · coord(q,d)    
              · ∑ (           
                    tf(t in d)   
                  · idf(t)²      
                  · t.getBoost() 
                  · norm(t,d)    
                ) (t in q) 
    

    现在,您未获得预期结果的几个原因之一可能是 norm(t,d)idf(t)²。例如,如果您有 extra 字段作为 paus me 并且其他字段有类似 my name is some paus something 之类的东西,这将使field length normnorm(t.d) 更高价值。此外,如果您有 10000 个文档,并且只有一个文档在 extra 字段中具有 paus,这会使 逆文档频率 相当高,因为它在此处计算为 idf(t) = 1 + log ( numDocs / (docFreq + 1)) numDocs=10000docFreq=1,这个值将被平方。我的数据集中正是这个问题。

    模糊查询得分较高可能与this issue 相关,它基本上是Lucene Issue。最新版本已修复此问题。

    一种可行的方法是将constant_score 赋予最后两个子句,然后将5 提升到前两个子句。 This 有助于理解。

    尝试逐步解决此问题,从两个子句开始,查看explain api 的输出,然后尝试三个,最后全部四个。同时删除 field boosting 并仅尝试使用 query boost逐渐你会明白的。

    希望对你有帮助!!

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2019-06-03
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多