【问题标题】:How to use SynonymFilterFactory with ShingleFilterFactory in Solr?如何在 Solr 中使用 SynonymFilterFactory 和 ShingleFilterFactory?
【发布时间】:2015-02-13 16:05:37
【问题描述】:

我想要实现的是搜索“除臭喷雾”匹配“止汗喷雾”、“除臭喷雾”等。

我正在使用 SynonymFilterFactory 在索引时为除臭剂、除臭剂和止汗剂添加同义词。我可以看到它在分析器中正常工作。

在此之后,我正在运行 ShingleFilterFactory (maxShingleSize="3") 以拆分为单词组合。这再次给了我正确的结果,例如分析“测试带状疱疹短语”给出:

  • 测试
  • 测试瓦
  • 测试带状疱疹短语
  • 带状疱疹短语
  • 短语

这是期望的结果。当我将同义词与带状疱疹结合起来时,问题就来了。例如,搜索“除臭喷雾”应该会给我:

  • 除臭喷雾
  • deo 喷雾
  • 止汗喷雾

我所有的同义词。但我实际看到的是:

  • 除臭剂
  • 除臭剂
  • 除臭剂deo止汗剂
  • deo
  • deo 止汗剂
  • deo 止汗喷雾
  • 止汗剂
  • 止汗喷雾

这显然也在从每个同义词中产生带状疱疹。我尝试交换过滤器工厂的顺序,但似乎无法使其正常工作。我做错了什么?

【问题讨论】:

  • 我应该补充一下,我有 expand=true 这样我就不必在查询时做同义词。如果我使用 expand=false 那么“deo spray”将被索引为“deodorant spray”,这是正确的,但需要我在查询时也运行 SynonymFilter。根据wiki.apache.org/solr/… 的文档,推荐在索引时扩展同义词。

标签: solr lucene


【解决方案1】:

您唯一能做的就是使用同义词过滤器而不进行扩展 - 将所有同义词减少到列表中的第一个。然后您必须在索引时以及查询时使用它。

这种方法不会导致documentation 中描述的问题,因为您还必须在索引上应用过滤器。

考虑以下场景:

  • 具有“文本”字段的索引,在查询时使用 SynonymFilter 和同义词 TV、Televesion 和 expand="true"
  • 包含术语“text:TV”的数千个文档
  • 数百个包含“text:Television”一词的文档

对 text:TV 的查询将扩展为 (text:TV text:Television) 并且 text:Television 的较低 docFreq 将为匹配“Television”的文档提供比匹配“TV”的文档更高的分数 - - 这对客户来说可能有点违反直觉。索引时间扩展(或缩减)将导致所有文档的 idf 相同,无论原始文本包含哪个术语。

但是,如果您想要支持文档中描述的多词同义词,您可能仍然会遇到问题。

我不知道由同义词组成的带状疱疹是否会影响搜索结果,但如果不是,那么您所花费的只是索引中的额外空间,因此请考虑是否要节省一些空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2011-05-15
    • 2020-10-19
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多