我正在将SOLR 3.6用于搜索服务器,并且text_general
类型为:
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
<filter class="solr.StemmerOverrideFilterFactory" dictionary="stemdict.txt" />
<filter class="solr.PorterStemFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.CommonGramsQueryFilterFactory" words="stopwords.txt" ignoreCase="true" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
<filter class="solr.StemmerOverrideFilterFactory" dictionary="stemdict.txt" />
<filter class="solr.PorterStemFilterFactory" />
</analyzer>
</fieldType>
但是我发现当我使用edismax
搜索“成为或不成为”时,由于停用词配置,整个短语将被删除。但我确实使用CommonGramsQueryFilterFactory
进行查询分析。调试显示:
<str name="rawquerystring">to be or not to be</str>
<str name="querystring">to be or not to be</str>
<str name="parsedquery">+()</str>
<str name="parsedquery_toString">+()</str>
我哪里做错了? edismax不支持CommonGramsQueryFilterFactory?
答案 0 :(得分:0)
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.CommonGramsFilterFactory说
&#34;通过组合常用令牌(通常与停用词列表相同)和常规令牌来制作带状疱疹(即the_cat)。&#34;
看起来它只将常用令牌与常规令牌结合在一起。你要做的是将常见的令牌与常见的令牌结合起来,这可能是失败的原因。
我还没试过,但是正在考虑使用它并碰到你的问题和这篇文档。
答案 1 :(得分:0)
似乎edismax将查询标记化并通过它自己分析每个术语。 CommonGramsQueryFilter应该获取所有单词以生成对,但在这种情况下,它得到术语'to'并且什么都不做,然后术语'be'并且什么也不做,等等......
因此,在这种情况下,CommonGramsQueryFilter不执行任何操作,StopFilterFactory会删除所有停用词,并为您留下空查询。