我有两种标题类型的内容:ABCWord
& ABC Word
。当我将搜索框关键字设置为:abc-word
时,会找到abc word
标题为ABC Word
的内容,但我还需要获得ABCWord
标题内容。
我尝试使用solr.EdgeNGramFilterFactory
和solr.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>
答案 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配置中的某些过滤器。最好了解每个过滤器对您的输入做了什么。