为什么在Solr中搜索部分词没有结果?
Why don't I get results when I search for partial words in Solr?
我试图找出我的分析器在 Solr 中的正确顺序,但当我搜索部分单词时没有得到任何结果。例如:
查询: Sto
想要的结果:斯德哥尔摩
查询:瑞典是
期望的结果:瑞典是一个欧洲城市
我只在搜索全部含义时收到结果,即期望的结果。对于到目前为止我所做的可能有问题的任何提示或技巧,我将不胜感激
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LengthFilterFactory" min="2" max="15"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.FlattenGraphFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LengthFilterFactory" min="2" max="15"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
您正在通过应用字段类型 text general 来标记文本。
为了获得部分单词匹配,您必须更改分词器。
在这种情况下尝试使用 ngram 分词器。
N-Gram 分词器。
读取字段文本并生成给定范围内大小的 n-gram 标记。
工厂class:solr.NGramTokenizerFactory
参数:
minGramSize:(整数,默认为 1)最小 n-gram 大小,必须 > 0。
maxGramSize:(整数,默认为 2)最大 n-gram 大小,必须 >= minGramSize。
示例:
默认行为。请注意,此分词器在整个字段上运行。它不会在 whitespace 处打破场。结果,space 字符包含在编码中。
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory"/>
</analyzer>
对于第二种情况,您将获得结果,但您正在寻找短语匹配。对于这样的文本,您需要使用 text_general 字段类型。也尝试使用 ediamx 并检查。
还有一点,你可以在solr admin分析页面验证你的字段类型。
我找到了丢失的部分。我犯的错误是我将我的字段作为字符串索引。索引为字符串的字段在没有分析的情况下被索引为短语。因此,我无法搜索字符串
的部分 words/part
我试图找出我的分析器在 Solr 中的正确顺序,但当我搜索部分单词时没有得到任何结果。例如:
查询: Sto
想要的结果:斯德哥尔摩
查询:瑞典是
期望的结果:瑞典是一个欧洲城市
我只在搜索全部含义时收到结果,即期望的结果。对于到目前为止我所做的可能有问题的任何提示或技巧,我将不胜感激
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LengthFilterFactory" min="2" max="15"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.FlattenGraphFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LengthFilterFactory" min="2" max="15"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
您正在通过应用字段类型 text general 来标记文本。
为了获得部分单词匹配,您必须更改分词器。
在这种情况下尝试使用 ngram 分词器。 N-Gram 分词器。
读取字段文本并生成给定范围内大小的 n-gram 标记。
工厂class:solr.NGramTokenizerFactory
参数:
minGramSize:(整数,默认为 1)最小 n-gram 大小,必须 > 0。
maxGramSize:(整数,默认为 2)最大 n-gram 大小,必须 >= minGramSize。
示例:
默认行为。请注意,此分词器在整个字段上运行。它不会在 whitespace 处打破场。结果,space 字符包含在编码中。
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory"/>
</analyzer>
对于第二种情况,您将获得结果,但您正在寻找短语匹配。对于这样的文本,您需要使用 text_general 字段类型。也尝试使用 ediamx 并检查。
还有一点,你可以在solr admin分析页面验证你的字段类型。
我找到了丢失的部分。我犯的错误是我将我的字段作为字符串索引。索引为字符串的字段在没有分析的情况下被索引为短语。因此,我无法搜索字符串
的部分 words/part