如何配置SOLR来处理类似的搜索关键字:`ABCWord`,`abc word`?

时间:2017-10-24 08:46:55

标签: solr

我有两种标题类型的内容:ABCWord& ABC Word。当我将搜索框关键字设置为:abc-word时,会找到abc word标题为ABC Word的内容,但我还需要获得ABCWord标题内容。

我尝试使用solr.EdgeNGramFilterFactorysolr.WordDelimiterFilterFactory,但似乎我错了。

我当前的schema.xml文字字段配置:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <!-- Case insensitive stop word removal.
          add enablePositionIncrements=true in both the index and query
          analyzers to leave a 'gap' for more accurate phrase queries.
        -->
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.WordDelimiterFilterFactory"
                protected="protwords.txt"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="1"
                catenateNumbers="1"
                catenateAll="0"
                splitOnCaseChange="0"
                preserveOriginal="1"/>
        <filter class="solr.LengthFilterFactory" min="2" max="100" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="30" side="front"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="30" side="back"/>
      </analyzer>
      <analyzer type="query">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.WordDelimiterFilterFactory"
                protected="protwords.txt"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="0"
                catenateNumbers="0"
                catenateAll="0"
                splitOnCaseChange="0"
                preserveOriginal="1"/>
        <filter class="solr.LengthFilterFactory" min="2" max="100" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="30" side="front"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="30" side="back"/>
      </analyzer>
    </fieldType>

1 个答案:

答案 0 :(得分:1)

你没有错误地使用它,但也许你正在使用过多影响最终结果的过滤器。 EdgeNGram应该可以解决您的问题,因为它会在您的输入中创建大小为3到30的标记。所以,“ABCWord”将成为“abc”,“abcw”,“abcwo”,“abcwor”和“abcword”,然后搜索“abc”应该匹配。

首先,我建议您在使用ngram时更改正在使用的fieldType,因为它会增加很多您的索引大小。最好创建一个新的字段类型,只在你真正需要它的字段中使用,而不是“text”fieldType,它可能会索引你不需要ngram的其他值。

其次,如果你的分析器定义对于索引和搜索时间是相同的,你不需要复制配置,只需使用'analyzer'而不是'analyzer type =“index”'和'analyzer type =“查询“”。

我强烈建议您检查solr admin中的分析选项卡,以了解Solr如何处理输入的索引和查询文本。当您尝试获得某些特定结果时,也可以删除fieldType配置中的某些过滤器。最好了解每个过滤器对您的输入做了什么。