首页 > 解决方案 > Solr 按文本搜索

问题描述

我在通过查询在 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”声明为
查询GLLMRC86E28L736X
查询GLLMRC86E28L736

搜索 1搜索 2

<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>

标签: apachesearchsolr

解决方案


您的 EdgeNgramFilter 有一个maxGramSize设置可以切断令牌的结尾 - X 在索引时被删除,而在查询时被保留(如果您尝试匹配前缀,它应该如此)。

在分析屏幕的左侧,您可以看到它生成了 的版本GLLMRC86E28L736X,但最后一个字符被删除了 - 即它在添加最后一个字符之前停止生成版本。查询仍然是GLLMRC86E28L736X,并且由于没有令牌匹配GLLMRC86E28L736X(只是GLLMRC86E28L736因为它在生成之后停止了),所以您不会受到任何影响。

如果您只想获得完全匹配,请为您的字段调整maxGramSize,或搜索不执行任何边图的字段。

此外,text_general如果我没记错的话,这不是示例中包含的字段类型的默认形式,因此将来如果您也包含该字段类型会很有帮助。


推荐阅读