我正在尝试使用同义词过滤器来搜索短语。
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"。
是的,很遗憾,这是一个众所周知的问题,因为 Solr 查询解析器在分析之前如何分解空白。因此,不是在令牌流中在“人”之前看到“蜘蛛”,而是简单地单独查看每个单词。只是“蜘蛛”之前/之后什么都没有,只是“人”之前/之后什么都没有。
这是因为大多数 Solr 查询表单将空格视为基本上是“OR”。搜索“spider OR man”而不是查看全文,对其进行分析以生成同义词,然后从中生成查询。
有关更多背景信息,请参阅此博客文章
这个问题有很多解决方案,包括:
对于此类问题,我通常的策略是使用同义词过滤器,不要扩展搜索以包括所有可能的同义词,而是标准化为单一形式。我在索引和查询字段分析中都这样做。
例如,在我的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 是两个单词,所以它可能(取决于我搜索的其他功能)单独或一起匹配这两个单词。通过选择单个单词形式进行规范化,我确保我的分词器不会尝试将其分解。