我在通过查询在Solr中搜索文档时遇到问题。
文档如下:
{
"id": "890_03366_00739",
"text": ["2509412 MARCO GLLMRC86E28L736X 03366 00739 "],
"_version_": 1612212288969769000
}
如果我使用查询text:GLLMRC86E28L736
搜索,则我正确地找到了文档。
如果我尝试使用查询text:GLLMRC86E28L736X
找不到文档,为什么会这样?
在我的架构中,字段text
被声明为<field name="text" type="text_general" indexed="true" required="true" stored="true"/>
我正在使用Solr 7.0.0。
更新:
“分析”页面显示我的字段“文本”和查询GLLMRC86E28L736X的此输出
查询GLLMRC86E28L736
按GLLMRC86E28L736X搜索
按GLLMRC86E28L736搜索
字段类型“ text_general”声明为
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" maxGramSize="15" minGramSize="2"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
答案 0 :(得分:1)
您的EdgeNgramFilter具有一个maxGramSize
设置,该设置可以切断令牌的结尾-索引时将删除X,而查询时将保留该X(如果尝试匹配前缀,则应保留)。< / p>
在分析屏幕的左侧,您可以看到它生成了GLLMRC86E28L736X
的版本,但是最后一个字符被删除了-即,在添加最后一个字符之前,它停止了生成版本。该查询仍然是GLLMRC86E28L736X
,并且由于没有匹配的令牌GLLMRC86E28L736X
(只有GLLMRC86E28L736
,因为它在生成后就停止了),因此您没有命中。
为您的字段调整maxGramSize
,或者如果您只想获得完全匹配的内容,则对不进行任何边缘语法分析的字段进行搜索。
此外,如果我没有记错的话,这不是示例中包含的text_general
字段类型的默认格式,因此,将来如果您也包含该字段类型,将会很有帮助。