2012-08-11 117 views
1

我的模型有一个tags字段,它是一个标签数组。我遇到的问题是我希望标签能够像关键字一样工作,但ES以某种方式将它们分解为用于分面的空间。多字面(ElasticSearch +轮胎)

的映射是:

indexes :tags, type: :array 

的查询热门的标签是:

tire.search do 
    facet 'tags' do 
    terms :tags, size: 100 
    end 
end 

现在是什么结果是单个单词。例如标记为“复古音乐”,“真棒”的唱片最终会有三个独立的标签。同样,如果我执行查询以搜索“复古音乐”(must { term 'tags', options[:tag] }),那么将失败,而对“复古”或“音乐”的查询将成功。这里期望的行为是标签应该是原子的,所以只有“复古音乐”(或“真棒”)标签搜索才能成功。

回答

7

默认情况下,elasticsearch使用“标准”分析器分析字符串,该分析器将字符串转换为小写,将它们拆分为单词并删除一些经常出现的单词(停用词)。您可以通过关闭分析仪领域的标签防止elasticsearch从做一切:

indexes :tags, :type => 'string', :index => :not_analyzed 
+0

这是有道理的,但由于某种原因不起作用。它仍然分解了数组项目。 BTW为什么“字符串”而不是“数组”?无论如何,我已经尝试过字符串,关键字和数组,但不幸的是他们都没有工作。 – mahemoff 2012-08-12 09:49:22

+0

您是否删除了旧的索引并在做出此更改后创建了新索引?这种类型的更改需要删除并重新创建索引。您能否显示完整的查询,因为数据的基础类型是字符串。它是一个数组的事实是由elasticsearch自动处理的。 – imotov 2012-08-12 13:04:17

+0

我没有删除旧的索引。我把完整的代码放在这里:https://gist.github.com/3332033。这基本上就是我提出的问题。 – mahemoff 2012-08-12 14:22:25