Club-Mate在弹性搜索中不适合Club-Mate

时间:2012-09-20 16:27:06

标签: elasticsearch

这是我的堆栈:

  • Rails 3.2.6
  • MongoID~> 2.5
  • 轮胎0.4.2
  • ElasticSearch Server

我想在弹性搜索中索引几千种产品。这是我的映射:

mapping do
    indexes :name, analyzer: 'snowball', boost: 100
    indexes :description, analyzer: 'snowball'
end 

不幸的是,搜索结果令人难以置信。通过搜索“club-mate”,第一个结果是“club-mate-c”。第二个结果是“俱乐部队友”。为什么“俱乐部队友”不适合“俱乐部队友”。 搜索结果按_score排序。没有其他的。

我感谢任何反馈。 我确信这只是一个配置问题。

1 个答案:

答案 0 :(得分:2)

您几乎没有提供有关要编制索引的数据,数据统一程度或查询方式的信息。

可能的问题是,clubmate这两个词在您的数据集中并不常见,并且在您的分片中分布不均。

默认情况下,每个分片都会单独考虑术语频率,因此如果在一个分片上,您有clubmate 3次,而在另一个分片上,您有club,{ {1}},mate一次,然后第二个分片可能会认为cclub比第一个分片更相关。

通常情况下,对于大量数据,术语频率甚至自身都不存在,因此这不再是一个问题。但是,对于少量数据,您可以看到类似的问题。

解决方案:

  • 使用单个分片而不是默认值5(如果您总是会有少量数据,那么这是更好的选择)
  • 索引更多数据
  • mate添加到搜索参数中,这将在运行查询之前检查所有分片中的字词频率

注意: search_type=dfs_query_then_fetch默认为search_type而不是query_then_fetch,因为通常情况下,您会有足够的数据来确保均匀的频率,并执行更好。

您可以在搜索参数中添加dfs_query_then_fetch,以查看每个文档的分数是如何计算出来的,这样可以更好地解决问题。