通过文本进行Solr搜索

时间:2018-09-21 12:58:27

标签: apache search 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的此输出
query GLLMRC86E28L736X
查询GLLMRC86E28L736 query GLLMRC86E28L736

按GLLMRC86E28L736X搜索 search 1 按GLLMRC86E28L736搜索 search 2 字段类型“ 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>

1 个答案:

答案 0 :(得分:1)

您的EdgeNgramFilter具有一个maxGramSize设置,该设置可以切断令牌的结尾-索引时将删除X,而查询时将保留该X(如果尝试匹配前缀,则应保留)。< / p>

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

为您的字段调整maxGramSize,或者如果您只想获得完全匹配的内容,则对不进行任何边缘语法分析的字段进行搜索。

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