Solr中的多词同义词搜索

Kua*_*uan 5 solr synonym

我正在尝试使用同义词过滤器来搜索短语。

peter=> spider man, spiderman, Mary Jane, .....
Run Code Online (Sandbox Code Playgroud)

我使用默认配置。当我把这些同义词成synonym.txt,然后重新启动Solr的似乎只有部分工作:它开始搜索"spider""man""spiderman""Mary""Jane",但我要搜索的是有意义的组合是什么-样"spider man""Mary Jane""spiderman"

Dou*_* T. 5

是的,很遗憾,这是一个众所周知的问题,因为 Solr 查询解析器分析之前如何分解空白。因此,不是在令牌流中在“人”之前看到“蜘蛛”,而是简单地单独查看每个单词。只是“蜘蛛”之前/之后什么都没有,只是“人”之前/之后什么都没有。

这是因为大多数 Solr 查询表单将空格视为基本上是“OR”。搜索“spider OR man”而不是查看全文,对其进行分析以生成同义词,然后从中生成查询。

有关更多背景信息,请参阅此博客文章

这个问题有很多解决方案,包括:

  • hon-lucene-同义词。这个插件在对多个字段生成 edismax 查询之前运行一个分析器。它有点像一个黑匣子,我发现它可以生成一些复杂的查询表单,从而产生奇怪的性能和相关性错误。
  • Lucidwork 的 autophrase 查询解析器通过有选择的 autophrasing,这个插件允许你指定不应该被分解为 OR 查询并且可以应用同义词扩展的关键短语(蜘蛛侠)
  • OpenSource Connection 的Match 查询解析器。在搜索字段之前使用查询指定的分析器运行搜索单个字段。还搜索多词同义词作为短语。我最喜欢的,但免责声明:我是作者:)
  • Rene Kriegler 的Querqy -- Querqy 是一个用于查询预处理规则的 Solr 插件。这些规则可以识别您的关键短语并将查询重写为非多词形式。
  • 自己动手:学习编写自己的查询解析器插件并根据需要处理问题。


fra*_*ces 4

对于此类问题,我通常的策略是使用同义词过滤器,不要扩展搜索以包括所有可能的同义词,而是标准化为单一形式。我在索引和查询字段分析中这样做。

例如,在我的fieldType/analyzer块中使用以下行schema.xml

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
Run Code Online (Sandbox Code Playgroud)

(注意expand="false"
...以及我的这一行synonyms.txt

spiderman, spider man, Mary Jane => peter
Run Code Online (Sandbox Code Playgroud)

这样我可以确保这四个值中的任何一个都将被索引作为“peter”进行搜索。例如,如果源文档提到“The Amazing Spider Man”,它将被索引为“The Amazing peter”。当用户搜索“Mary Jane”时,它会搜索“peter”,因此它会匹配

这里重要的是,因为“Mary”不是逗号分隔的同义词之一,所以如果它后面没有“Jane”出现,它不会改变。因此搜索“Mary is Amazing”实际上会搜索“Mary is Amazing”,并且不会与文档匹配。

重要的细节之一是我选择了一种只有一个单词的规范化形式(例如“peter”)。我可以这样组织它:

peter, spiderman, spider man => Mary Jane
Run Code Online (Sandbox Code Playgroud)

但因为 Mary Jane 是两个单词,所以它可能(取决于我搜索的其他功能)单独或一起匹配这两个单词。通过选择单个单词形式进行规范化,我确保我的分词器不会尝试将其分解。