要进行子字符串搜索,我添加了一个新的fieldType - 带有NgramFilter的“Text”。
它运作良好,但缺点是这个问题
实施例
name = ['Apple','Samy','And','a']
当我进行搜索name:a
时,上述所有项目都会被提起。即使搜索更改为“App”。以上所有项目均已提取。我该如何解决这个问题?
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="100" />
</analyzer>
</fieldType>
答案 0 :(得分:0)
正如您在分析中所看到的,索引值和查询值都通过EdgeNGramFilter进行解析 - 这意味着它将匹配任何其他东西的子串。添加一个更简单的过滤器来查询字段,你应该好好去。
来自Wiki的示例应该可以通过复制和粘贴它来使用:
<fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
</fieldType>
我最初的猜测是,由于您没有提供两个替代定义,Solr将为两者使用相同的链。您的分析输出证实了这种怀疑。尝试添加一个带有type="query"
的分析器,以便有一个特定的链来查询该字段(您不希望EdgeNGram同时存在)。