6

我希望查询返回一个计算如下的分数:

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

例如

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。它比示例稍微复杂一些,但应该可以理解。

4

1 回答 1

4

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

于 2013-07-27T14:16:00.663 回答