2

我将 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用于搜索“to be or not to be”时,由于停用词配置,整个短语将被删除。但我确实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?

4

2 回答 2

0

似乎 edismax 对查询进行了标记,并自己分析了每个术语。CommonGramsQueryFilter 应该获取所有单词以生成对,但在这种情况下,它获取术语“to”并且什么都不做,然后是术语“be”并且什么都不做等等。

因此,在这种情况下,CommonGramsQueryFilter 什么都不做,StopFilterFactory 会删除所有停用词并为您留下一个空查询。

于 2014-08-06T07:22:53.283 回答
0

http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.CommonGramsFilterFactory

“通过组合常见标记(通常与停用词列表相同)和常规标记来制作带状疱疹(即 the_cat)。”

看起来它只结合了普通标记和常规标记。您正在尝试做的是将通用令牌与通用令牌结合起来,这可能是失败的原因。

我还没有尝试过,但正在考虑使用它并碰到你的问题和这篇文档。

于 2013-10-01T12:51:07.853 回答