如何配置Solr做部分词匹配
How to configure Solr to do partial word matching
给定以下一组值,我如何将字段配置为 return 部分单词匹配但也匹配整个搜索词的值?
值:
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
return 显示的所有三个值,而不是仅 Stanford
。但是,没有 EdgeNGramFilterFactory
,部分单词根本不匹配。
Solr 字段的正确配置是 return 部分单词匹配但也匹配整个搜索词的值?
我想我明白了。 不过,我绝对欢迎其他答案和其他更正。
解决方案似乎是只在索引时使用 EdgeNGramFilterFactory
,而不是在查询时。当您考虑时,这是有道理的。我在索引时需要 n-gram,但在查询时只想匹配实际的搜索词。
<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>
我有类似的要求并尝试了这个...创建了不同的字段类型...
<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>
我还有一个要求...
下面的博客会详细解释
您可以使用
N-Gram 过滤器
生成给定范围内大小的 n-gram 标记。请注意,令牌按位置排序,然后按克数排序。
工厂class:solr.NGramFilterFactory
参数:
minGramSize:(整数,默认为 1)最小克大小。
maxGramSize:(整数,默认为 2)最大克大小。
示例:
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.NGramFilterFactory"/>
</analyzer>
在:"four score"
输出:"f"、"o"、"u"、"r"、"fo"、"ou"、"ur"、"s", "c", "o", "r", "e", "sc", "co", "or", "re"
给定以下一组值,我如何将字段配置为 return 部分单词匹配但也匹配整个搜索词的值?
值:
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
return 显示的所有三个值,而不是仅 Stanford
。但是,没有 EdgeNGramFilterFactory
,部分单词根本不匹配。
Solr 字段的正确配置是 return 部分单词匹配但也匹配整个搜索词的值?
我想我明白了。 不过,我绝对欢迎其他答案和其他更正。
解决方案似乎是只在索引时使用 EdgeNGramFilterFactory
,而不是在查询时。当您考虑时,这是有道理的。我在索引时需要 n-gram,但在查询时只想匹配实际的搜索词。
<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>
我有类似的要求并尝试了这个...创建了不同的字段类型...
<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>
我还有一个要求... 下面的博客会详细解释
您可以使用
N-Gram 过滤器
生成给定范围内大小的 n-gram 标记。请注意,令牌按位置排序,然后按克数排序。
工厂class:solr.NGramFilterFactory
参数:
minGramSize:(整数,默认为 1)最小克大小。 maxGramSize:(整数,默认为 2)最大克大小。
示例:
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.NGramFilterFactory"/>
</analyzer>
在:"four score"
输出:"f"、"o"、"u"、"r"、"fo"、"ou"、"ur"、"s", "c", "o", "r", "e", "sc", "co", "or", "re"