给定以下一组值,如何配置字段以返回部分字匹配但又与整个搜索字词匹配的值?
值:
Texas State University
Stanford University
St. Johns College
搜索字词:sta
期望的结果:
Texas State University
Stanford University
搜索字词:stan
期望的结果:
Stanford University
搜索字词:st un
期望的结果:
Texas State University
Stanford University
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
</fieldType>
我认为我的问题出在EdgeNGramFilterFactory
上。如上所示,对stan
的第二次搜索会返回显示的所有三个值,而不是Stanford
。但是,如果没有EdgeNGramFilterFactory
,部分词语根本就不匹配。
Solr字段的正确配置是返回部分字匹配但又与整个搜索字词匹配的值吗?
答案 0 :(得分:9)
我想我明白了。 我非常欢迎其他答案和其他更正。
解决方案似乎只是在编制索引时使用EdgeNGramFilterFactory
,而不是在查询时使用<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
。当你想到它时,这是有道理的。索引时我想要n-gram,但只想在查询时匹配实际的搜索词。
{{1}}
答案 1 :(得分:0)
我有类似的要求,试过这个...创建了不同的字段类型......
<fieldType name="text_reference" class="solr.TextField" sortMissingLast="true" omitNorms="true" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="50" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
我另一个要求...... 以下博客将详细解释
答案 2 :(得分:0)
您可以使用
N语法过滤器
生成大小在给定范围内的n-gram令牌。请注意,令牌是按位置排序,然后按大小排序。
Factory类:solr.NGramFilterFactory
参数:
minGramSize :(整数,默认值为1)最小克大小。 maxGramSize :(整数,默认值为2)最大克大小。
示例:
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.NGramFilterFactory"/>
</analyzer>
在:“四分”
输出:“ f”,“ o”,“ u”,“ r”,“ fo”,“ ou”,“ ur”,“ s”,“ c”,“ o”,“ r”,“ e”,“ sc”,“ co”,“ or”,“ re”