我希望查询返回的分数计算如下:
标题+描述/查询字词数中每个查询字词的出现
例如
EbSearch.add [
new_job( id: 1, title: "Java Programmierer",
description: "Java Programmierer")
]
res = EbSearch.search("Java Programmierer").results.first.score.should == 4
此时它输出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
非常感谢任何想法如何解决这个问题。
修改
我意识到我提供的内容不够。
以下是我已经制定的其他一些片段。我写了一个自定义的SimilarityProvider来禁用idf和规范化。 https://gist.github.com/outsmartin/6114175
完整的轮胎代码可在https://gist.github.com/6114186找到。它比示例稍微复杂一些,但它应该是可以理解的。
答案 0 :(得分:3)
您可以使用analyze命令轻松获取查询的分析术语列表。但是,我必须提到Elasticsearch评分比在微小索引上运行测试时看起来要复杂得多。您可以在Lucene documentation中找到Elasticsearch正在使用的公式,您可以使用explain命令查看此公式如何应用于您的结果。我还建议使用单个分片或使用dfs_query_then_fetch搜索类型在索引上测试和调整评分算法,这会在小索引上产生更精确的结果。