【问题标题】:Solr search by textSolr 按文本搜索
【发布时间】:2019-02-25 21:34:46
【问题描述】:

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

【问题讨论】:

  • 根据您发布的详细信息,它应该可以按预期工作。给定索引文本和您的查询,核心下的“分析”页面显示给定字段类型的内容是什么?
  • 我添加了分析和打印屏幕

标签: apache search solr


【解决方案1】:

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

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

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

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

【讨论】:

  • 在“index”分析器中,EdgeNGramFilterFactory 的 maxGramSize 设置为 15,在“query”分析器中没有 EdgeNGramFilterFactory 过滤器。我应该编辑一些东西吗?
  • 是的,因为 maxGramSize 设置为 15,而 GLLMRC86E28L736X 有 16 个字符,15 之后的任何内容都会被截断。如果您想保留所有令牌而不考虑大小,请将maxGramSize 设置为最长令牌的长度(或者如果您不知道最长令牌是多少并且您仍想生成最大大小的令牌,则只需设置 32768)。如果您不需要前缀搜索,请删除边缘 ngram 过滤器。
  • 它有效,谢谢。唯一的问题是我需要重新索引整个核心。
猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2013-07-21
  • 1970-01-01
  • 2015-08-28
相关资源
最近更新 更多