0

这是我的堆栈:

  • 导轨 3.2.6
  • MongoID ~> 2.5
  • 轮胎 0.4.2
  • 弹性搜索服务器

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

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

不幸的是,搜索结果非常糟糕。通过搜索“club-mate”,第一个结果是“club-mate-c”。第二个结果是“club-mate”。为什么“club-mate”不适合“club-mate”。搜索结果按 _score 排序。没有其他的。

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

4

1 回答 1

2

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

一个可能的问题是,这些术语在您的数据集中并不常见,club并且mate在您的分片中分布不均。

默认情况下,每个分片单独考虑词频,因此如果在一个分片上你有club, mate3 次,而在另一个分片上你有club, mate,c一次,那么第二个分片可能会考虑club并且mate比第一个分片更相关。

通常,在大量数据的情况下,词频甚至会出现问题,因此这不再是一个问题。但是,使用少量数据,您可以看到这样的问题。

解决方案:

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

注意:默认search_typequery_then_fetch而不是dfs_query_then_fetch因为通常情况下,您将有足够的数据来确保均匀的词频,并且它表现更好。

您可以添加explain=1搜索参数以查看每个文档的分数是如何计算的,这应该可以更清楚地说明问题。

于 2012-09-21T08:44:48.587 回答