3

所以我在我的 Rails 项目中使用了太阳黑子,并且我正在索引歌曲名称。我想要做的是当我搜索特定术语(例如“迷失自我”)时,在我的结果列表顶部显示包含查询完全匹配的记录(带有空格和所有内容)。

为此,我决定像这样fieldTypeschema.xmlusing中定义一个新的KeywordTokenizerFactory(我打算将它与带有 的普通文本字段一起使用StandardTokenizer,同时使用这两个并提升使用该字段得出的结果KeywordTokenized):

<fieldType name="text_exact" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.TrimFilterFactory"/>
  </analyzer>
</fieldType>

并添加这样的动态字段(不确定是否应该为此目的多值,也许有人也可以启发我):

<dynamicField name="*_exact" stored="false" type="text_exact" multiValued="true" indexed="true"/>

现在,在我的song.rb文件中,我在searchable配置中有这个:

text :song_name do
  self.name
end

text :song_name_exact, as: :song_name_exact do
  self.name
end

问题是,当我尝试使用该song_name_exact字段进行搜索时,如果我的查询包含空格,则不会得到任何结果(因此,如果我有一首歌曲被调用foo并且我搜索foo它会找到它,但如果我有一个歌曲被调用foo bar并搜索foo bar,则搜索查询不返回任何结果。

所以首先,我会问我的方法是否正确,为什么使用关键字标记器在字段上的搜索不能正常工作?

4

1 回答 1

1

只搜索“lose yourself”没有提供结果的原因是KeywordTokenizerFactory生成的标记是“lose youself”,但是 sunspot 使用的 queryParse 将您的查询分为两个标记“lose”和“yourself”

解决方案

所以你应该通过在搜索中添加双引号来搜索整个短语"\"loose yourself\""

于 2013-03-21T22:33:28.983 回答