2012-09-20 65 views
0

俱乐部队友这是我的筹码:俱乐部队友不适合在elasticsearch

  • 的Rails 3.2.6
  • MongoID〜> 2.5
  • 轮胎0.4.2
  • ElasticSearch服务器

我有一对夫妇一千产品我想在弹性搜索索引。这是我的映射:

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

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

我明白任何种类的反馈。 我相信这只是一个配置问题。

回答

2

您提供哪些数据您索引,数据如何制服,或你是如何查询它的资料很少。

一个可能的问题是条款clubmate不在你的数据集很常见的,在你的碎片分布不均。

默认情况下,术语频率分别由每个碎片考虑,所以如果在一个碎片你有clubmate 3倍,而在另一碎片你有clubmatec一次,那么第二个碎片可能会考虑clubmate比第一个碎片更相关。

典型地,具有大量数据的,术语频率甚至自己出,所以这不再是一个问题。但是,使用少量数据时,您可以看到类似的问题。

解决方案:

  • 使用一个单一的碎片,而不是默认的5(如果你总是有一个小数据量,那么这是更好的选择)
  • 指数更多的数据
  • 添加search_type=dfs_query_then_fetch您的搜索参数,它会检查所有碎片术语频率运行查询

注意前:search_type默认为query_then_fetch而不是dfs_query_then_fetch因为通常情况下,你将有足够的数据,以确保偶数项的频率,而且性能更好。

您可以添加到explain=1搜索参数,看看比分为每个文档已经计算出,这应该阐明这个问题更多的光线。

+0

伟大的答案克林顿,一如既往! – javanna

+0

非常感谢您的回答。索引中包含约14万个文件。许多名字都是重复的。我对索引进行了一些调整。我意识到,作为更多的属性,我添加到索引,最糟糕的结果。如果我仅索引名称,而没有别的,那么搜索就像预期的那样工作。但是,尽快将索引和其他字段添加到索引中,搜索结果变得非常糟糕。 –

+0

然后,您需要提供explain = 1的“坏”查询和结果的示例,并且如果您提供存储在ES中的实际映射,而不是轮胎配置,则会有所帮助。 – DrTech