2016-10-22 63 views
0

我一直在浏览Elasticsearch的文档,并对Elasticsearch中使用的相关性评分基础知识感到好奇。所以在ES中,基本上有三个因素 - 词频,逆文档频率和字段长度 - 用于计算特定文档的相关分数。在Elasticsearch中定制相关评分

现在给定条件,我不希望我的结果受术语频率和字段长度的影响。我怎样才能做到这一点,我在某个地方读了它,因为你需要向现场提供“not_analyzed”分析仪。但是这样做会打败我的许多功能,所以这里的问题就出现了如何防止我的结果受术语频率和字段长度的影响,同时仍然使用我的自定义分析器或其他分析器。

回答

0

您可以使用的一个功能是constant_scorequery。例如,如果您想要检测文本中某个特定术语集何时出现,无论它们出现的次数和文档的长度如何,都可以使用constant_score来包装过滤器或查询,并指定一个固定的评分到符合他们的文件。例如,如果您想查找与“曲轴”,“气缸”和“发动机”等术语相关的文件,并且您希望对术语“气缸”给予更多的重视,而不是“曲轴”,而更多的重量,“曲轴”,而不是“引擎”,你可以使用这样的查询:

GET /_search 
{ 
    "query": { 
     "bool": { 
      "should": [ 
       { 
        "constant_score": { 
         "boost": 3, 
         "query": { "match": { "fulltext": "cylinder" }} 
        } 
       }, 
       { 
        "constant_score": { 
         "boost": 2, 
         "query": { "match": { "fulltext": "crankshaft" }} 
        } 
       }, 
       { 
        "constant_score": { 
         "query": { "match": { "fulltext": "engine" }} 
        } 
       } 
      ] 
     } 
    } 
} 

在这种情况下,你会与所有这方面的配套文件,但你可以通过参数boost为每个词赋予自己的分数来控制每个词的重要性。

请注意,在这种情况下,“Coordination factor”这个分数也给予了查询条件百分比较高的文档更多权重的分数也被考虑在内。