我一直在使用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>
答案 0 :(得分:2)
字段类型中的WordDelimiterFilterFactory可能会从字符串“students_teachers”生成术语“学生”和“教师”。
因此,当您搜索“学生”时,它也会匹配最初为“students_teachers”的字符串。
顺便说一句:Solr是一个非常易配置的工具,可能非常复杂,我建议不要把它当作黑盒子,或者你很可能会有越来越多的这些“WTF时刻”。