Solr查询与过滤查询的工作方式不同

时间:2011-12-11 21:53:13

标签: ruby-on-rails filter solr

我一直在使用solr一段时间(acts_as_solr),但只是遇到了一个我似乎无法工作的非常奇怪的事情。

我有一个'text'字段可以调用它

audience = [students, teachers, students_teachers, none]

发送查询时

q= audience:students 

只返回那些设置为学生的人。

但如果我这样做

fq= audience:students

我和[学生,学生_老师]

取得了成绩

我试过在过滤器查询周围加上引号,parens和各种各样的排序,但似乎并没有像我期望的那样尊重它们。我实际上在这里使用fq的否定方面,以向用户隐藏一些结果。

我正在使用solr 1.4.1

有什么想法?我即将将选项更改为唯一的单词而不重用。可能是名字中_的问题。

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>

1 个答案:

答案 0 :(得分:2)

字段类型中的WordDelimiterFilterFactory可能会从字符串“students_teachers”生成术语“学生”和“教师”。

因此,当您搜索“学生”时,它也会匹配最初为“students_teachers”的字符串。

顺便说一句:Solr是一个非常易配置的工具,可能非常复杂,我建议不要把它当作黑盒子,或者你很可能会有越来越多的这些“WTF时刻”。