Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Solr中的多词同义词搜索_Solr_Synonym - Fatal编程技术网

Solr中的多词同义词搜索

Solr中的多词同义词搜索,solr,synonym,Solr,Synonym,我正在尝试使用同义词过滤器来搜索短语 peter=> spider man, spiderman, Mary Jane, ..... 我使用默认配置。当我将这些同义词放入synonym.txt并重新启动Solr时,它似乎只起了部分作用:它开始搜索“spider”,“man”,“spiderman”,“Mary”和“Jane”,但我想要搜索的是有意义的组合,比如“spiderman”,“Mary Jane”和“蜘蛛侠”我解决这类问题的通常策略是使用同义词过滤器,不扩展搜索范围以包括所有可能

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

peter=> spider man, spiderman, Mary Jane, .....

我使用默认配置。当我将这些同义词放入
synonym.txt
并重新启动Solr时,它似乎只起了部分作用:它开始搜索
“spider”
“man”
“spiderman”
“Mary”
“Jane”
,但我想要搜索的是有意义的组合,比如
“spiderman”
“Mary Jane”
“蜘蛛侠”

我解决这类问题的通常策略是使用同义词过滤器,不扩展搜索范围以包括所有可能的同义词,而是将其规范化为一种形式。我在索引和查询字段分析中同时执行此操作

例如,在
schema.xml
中的my
fieldType/analyzer
块中使用此行:

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
通过这种方式,我确保这四个值中的任何一个都将被索引并搜索为“peter”。例如,如果源文档提到“神奇蜘蛛侠”,它将被索引为“神奇彼得”。当用户搜索“Mary Jane”时,它将搜索“peter”,因此它将匹配

这里重要的一点是,因为“Mary”不是逗号分隔的同义词之一,如果没有“Jane”跟随,它将不会被更改。因此搜索“Mary is Axing”实际上会搜索“Mary is Axing”,并且它与文档不匹配

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

peter, spiderman, spider man => Mary Jane

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

这是Solr/Lucene中的一个已知限制。基本上,您必须提供一种替代的标记化形式,以便特定的空格分隔词(即短语)可以被视为单个单词。 实现这一点的一种方法是在客户端执行此操作,即在调用Solr的应用程序中,在编制索引时,保留同义词短语列表,并使用替代项查找/替换这些短语值(例如,删除空格或将其替换为不视为令牌边界的分隔符)

例如,如果你想在同义词中使用“Hello There”作为短语,那么在编制索引时将其替换为“HelloThere”

现在,在synonyms.txt文件中,您可以拥有(例如):

同样,在搜索时,将查询字符串中的“Hello There”替换为hellother,然后它们将作为Hello的同义词进行匹配


或者,您可以使用LucidWorks创建的,在github上提供的。这是通过维护一个令牌流来实现的,这样它可以计算出两个或多个连续令牌的组合是否与同义词短语中的一个匹配,如果不匹配,它会将第一个令牌丢弃为与短语不匹配。我不确定这会产生多少开销dds,但这似乎是一种很好的方法-默认情况下,在Solr中将其作为同义词过滤器的一部分会很好。

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

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

有关更多背景信息,请参阅

这个问题有很多解决方案,包括以下内容:

  • 。此插件在多个字段上生成eDiscoveryMax查询之前运行分析器。这有点像黑盒子,我发现它可以生成一些复杂的查询表单,这些表单会产生奇怪的性能和相关性bug
  • 通过选择性地自动措辞,该插件允许您指定不应被分解或查询的关键短语(蜘蛛侠),并可以应用同义词扩展
  • 开源连接的。在搜索字段之前,使用指定的查询分析器运行搜索单个字段。还将多词同义词搜索为短语。我的最爱,但免责声明:我是作者:)
  • Rene Kriegler的--Querqy是查询预处理规则的Solr插件。这些规则可以识别关键短语,并将查询重写为非多项形式
  • 自己动手:学会写自己的东西,并按照自己的意愿处理问题

感谢您提供的信息(尽管我可能需要更多的时间来理解这一点),但有一件事我无法再做,那就是重新编制所有文档的索引。我只能编辑synonym.txt并重新启动SOLRAh。那么您将无法在索引时应用规范化,这是我策略的一个重要部分。缺少这些,选择就更少了。将更多的搜索作为显式短语搜索可能会有所帮助。换句话说,不要搜索
peter
,而是尝试搜索
“peter”
。这并不理想,因为您可能不想一直使用短语搜索,但在某些情况下,当您可以包含引号时,它可能会对您有所帮助。由于这在应用过滤器工厂之前就被标记化了,“蜘蛛”和“人”不是两个不同的标记吗?在这种情况下,“蜘蛛侠”将永远不会匹配提供给过滤器的令牌。看这张图:这个过滤器做同义词映射。在同义词列表中查找每个标记,如果找到匹配项,则发出同义词代替标记。新标记的位置值设置为它们都出现在原始标记的同一位置。只想指出,solr增加了对多术语同义词的更好支持。看,你应该
peter, spiderman, spider man => Mary Jane
Hi HelloThere Wotcha => Hello