【问题标题】:Sunspot SOLR KeywordTokenizer - search won't return proper resultsSunspot SOLR KeywordTokenizer - 搜索不会返回正确的结果
【发布时间】:2012-05-24 19:01:13
【问题描述】:

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

为此,我决定像这样使用KeywordTokenizerFactoryschema.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


【解决方案1】:

只搜索“loose yourself”没有结果的原因是KeywordTokenizerFactory生成的token是“loose youself”,但是sunspot使用的queryParse将你的查询分成了两个token “失去”和“自己”

解决方案

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    相关资源
    最近更新 更多