【发布时间】:2012-05-24 19:01:13
【问题描述】:
所以我在我的 rails 项目中使用了 sunspot,并且我正在索引歌曲名称。 我想要做的是当我搜索特定术语(例如“迷失自我”)时,在我的结果列表顶部显示包含完全匹配的记录用于查询(带有空格和所有内容)。
为此,我决定像这样使用KeywordTokenizerFactory 在schema.xml 中定义一个新的fieldType(我打算将它与带有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 字段进行搜索时,如果我的查询包含空格,则会得到 no 结果(因此,如果我有一首名为 foo 的歌曲并且我搜索foo 它会找到它,但如果我有一个叫 foo bar 并搜索 foo bar,搜索查询不会返回任何结果。
首先,我想问一下我的方法是否正确,为什么使用关键字标记器在字段上的搜索不能正常工作?
【问题讨论】:
-
您的搜索查询使用什么样的 - 您也需要使用类似的分析器
-
如果您问我是否使用相同的分析器进行查询和索引,答案是肯定的(如果您查看 fieldtype 配置,您会发现我没有将查询和索引分析器,所以它们都使用相同的东西)
-
如果您在搜索前将术语“包裹”在引号中但使用常规文本字段怎么办?如果您还需要非精确匹配,您可以进行 2 次搜索...
-
我没有尝试将这个术语用引号括起来.. 而且这似乎是一个 hack.. 我的意思是为什么要弯曲太阳黑子/solr,如果这是它应该工作的方式跨度>
-
您使用的是标准查询解析器还是 dismax 查询解析器?
标签: ruby-on-rails search solr sunspot