elasticsearch,scoring,Search,Lucene,elasticsearch,Scoring" /> elasticsearch,scoring,Search,Lucene,elasticsearch,Scoring" />

ElasticSearch默认评分机制

ElasticSearch默认评分机制,search,lucene,elasticsearch,scoring,Search,Lucene,elasticsearch,Scoring,我要找的是,关于ElasticSearch(Lucene)的默认评分机制是如何工作的,简单明了的解释。我的意思是,它是使用Lucene评分,还是使用自己的评分 例如,我想通过“名称”字段搜索文档。我使用.NETNest客户端编写查询。让我们考虑一下这种类型的查询: IQueryResponse queryResult=client.Search(s=> s、 从(0) .尺寸(300) .解释 .Query(q=>q.Match(a=>a.OnField(q.Resolve(f=>f.Name)

我要找的是,关于ElasticSearch(Lucene)的默认评分机制是如何工作的,简单明了的解释。我的意思是,它是使用Lucene评分,还是使用自己的评分

例如,我想通过“名称”字段搜索文档。我使用.NETNest客户端编写查询。让我们考虑一下这种类型的查询:

IQueryResponse queryResult=client.Search(s=>
s、 从(0)
.尺寸(300)
.解释
.Query(q=>q.Match(a=>a.OnField(q.Resolve(f=>f.Name)).QueryString(“ExampleName”))
);
转换为这样的JSON查询:

{
 "from": 0,
 "size": 300,
 "explain": true,
 "query": {
   "match": {
     "Name": {
       "query": "ExampleName"
      }
    }
  }
}
大约有110万个文档正在执行搜索。我得到的回报是(这只是结果的一部分,由我自己格式化):

其中第一个字段只是一个Id,第二个是ElasticSearch执行搜索的名称字段,第三个是分数

如您所见,ES索引中有许多重复项。由于发现的一些文档具有不同的分数,尽管它们完全相同(只有不同的Id),但我得出结论,不同的碎片在整个数据集的不同部分上执行了搜索,这使我发现分数在某种程度上基于给定碎片中的总体数据,不只是在搜索引擎实际考虑的文档上


问题是,这个评分到底是如何工作的?我的意思是,你能告诉我/给我看/给我指一个精确的公式来计算ES发现的每个文档的分数吗?最后,如何改变这种评分机制?

默认评分是核心Lucene中的DefaultSimilarity算法。您可以通过配置或使用类似的工具来自定义评分


显示的前五个结果中的奇数分数变化似乎很小,就查询结果的有效性及其顺序而言,这与我无关,但如果您想了解其原因,则可以准确地显示那里发生的情况。

分数变化基于给定分片中的数据(如您所怀疑的那样)。默认情况下,ES使用名为“查询然后获取””的搜索类型,该类型将查询发送到每个碎片,并使用本地TDIFs查找具有分数的所有匹配文档(这将因给定碎片上的数据而异-这是您的问题)

您可以通过使用“dfs查询然后获取”“搜索类型-预先查询每个分片,询问术语和文档频率,然后向每个分片发送查询等来更改此设置

您可以在url中设置它

$ curl -XGET '/index/type/search?pretty=true&search_type=dfs_query_then_fetch' -d '{
  "from": 0,
  "size": 300,
  "explain": true,
  "query": {
    "match": {
      "Name": {
        "query": "ExampleName"
      }
    }
  }
}' 

ElasticSearch文档中的精彩解释:

  • 什么是相关性:

  • 相关性评分背后的理论:


好的,这几乎涵盖了我想知道的内容。ES纯粹使用Lucene相似性的信息非常有用。谢谢!有关Lucene评分算法中因素的更多详细信息:
$ curl -XGET '/index/type/search?pretty=true&search_type=dfs_query_then_fetch' -d '{
  "from": 0,
  "size": 300,
  "explain": true,
  "query": {
    "match": {
      "Name": {
        "query": "ExampleName"
      }
    }
  }
}'