如何根据elasticsearch中的查询词数计算得分?

out*_*tin 5 elasticsearch tire

我希望查询返回一个计算得分,如:

标题中每个查询词的出现+描述/查询词的数量

例如

EbSearch.add [ 
new_job( id: 1, title: "Java Programmierer", 
description: "Java Programmierer")
]

res = EbSearch.search("Java Programmierer").results.first.score.should == 4
Run Code Online (Sandbox Code Playgroud)

目前它输出8,因为它对每个术语进行查询并总结它.之后我可以分开,但我没有分析的查询条款,因此化合物可能会弄乱分数.

查询结构如下:

search = Tire.search index_name do
  query do 
    dis_max do 
       query { string query, fields: ['title^3', 'description.with_synonyms^0.5'], use_dis_max: false, default_operator: "OR" }  
       query { string query, fields: ['title^3', 'description.without_synonyms'], use_dis_max: false, default_operator: "OR"}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决这个问题非常感谢.

编辑

我意识到我提供的背景不够.

以下是我已经制定的其他一些片段.我写了一个自定义的SimilarityProvider来禁用idf和规范化.https://gist.github.com/outsmartin/6114175

完整的轮胎代码可在https://gist.github.com/6114186找到.它比示例稍微复杂一点,但它应该是可以理解的.

imo*_*tov 4

您可以使用分析命令轻松获取查询的已分析术语列表。然而,我不得不提的是,Elasticsearch 评分比在微小索引上运行测试时看起来要复杂得多。您可以在Lucene 文档中找到 Elasticsearch 使用的公式,并且可以使用解释命令来查看该公式如何应用于您的结果。我还建议使用单个分片或使用dfs_query_then_fetch搜索类型在索引上测试和调整评分算法,这会在小索引上产生更精确的结果。