如何让Solr的同义词功能生效

15

我正在尝试在Solr中设置一些基本的同义词。我一直在使用的一个是:

us,usa,united states

我的理解是将其添加到同义词文件中将允许用户搜索US,并返回包含usa或united states的文档。如果用户输入usa或united states也是如此。

不幸的是,即使这样设置后,当我进行搜索时,结果将返回包含所有三个单词的项目 - 它执行的是同义词的AND运算而不是OR运算。

如果我打开调试功能,我看到的确实是这样(加上一些词干处理):

(+DisjunctionMaxQuery(((westCite:us westCite:usa westCite:unit) | (text:us text:usa text:unit) | (docketNumber:us docketNumber:usa docketNumber:unit) | ((status:us status:usa status:unit)^1.25) | (court:us court:usa court:unit) | (lexisCite:us lexisCite:usa lexisCite:unit) | ((caseNumber:us caseNumber:usa caseNumber:unit)^1.25) | ((caseName:us caseName:usa caseName:unit)^1.5))))/no_coord

我是否做错了什么导致了这种情况?我的defaultOperator设置为AND,但我期望同义词过滤器能够理解这一点。

3个回答

24

绝对有效。很高兴在将600,000个文档索引到现场网站之前解决了这个问题... - mlissner
1
请注意,此建议仅适用于旧版本的SOLR。新的SynonymGraphFilter在查询时使用也很好。 我已经看到它在生产中成功使用。如果每次同义词更改后都不必重新索引,那将会更加容易... - Suzana

9
为了更好地理解同义词搜索,请按照以下步骤逐步实施(我使用的是solr 6.5.*版本): 第一步: 下载country-synonyms.txt文本文件,并将其放置在以下路径中:

路径:\solr-6.5.1\server\solr\yourCore\conf

yourCore: 核心名称应相应更改。 第二步: 在上述相同路径下的managed-schema文件中添加字段类型。
<fieldType name="country" class="solr.TextField" positionIncrementGap="100" sortMissingLast="true">
<analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.TrimFilterFactory"/>
  <filter class="solr.SynonymFilterFactory" expand="false" ignoreCase="true" synonyms="country-synonyms.txt" tokenizerFactory="solr.KeywordTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
</analyzer></fieldType>

第三步:在同一文件(managed-schema)中添加类型为国家的字段(国籍)。

<field name="Nationality" type="country" indexed="true" stored="true"/>

步骤 4:重新启动 Solr。

solr restart -p <your solr port>

步骤5:

现在导入包含国籍字段的数据。***

步骤6:

现在按照以下情况进行查询和测试:

查询

  1. 国籍:美国
  2. 国籍:USA
  3. 国籍:美利坚合众国
  4. 国籍:美国合众国

以上所有查询将给您相同的结果。

注意:***仅在执行上述步骤(包括solr重启)后导入数据。它可能无法在现有数据上运行(有关更多详细信息,请参见:AnalyzersTokenizersTokenFilters


1
非常有帮助!谢谢 - anzie001

2
为了从新的Solr角度完整回答,我想在同义词方面添加一点内容。最近版本的Solr在查询和索引时间内正确处理多词同义词。
要使用新的同义词实现,您需要使用不同的过滤器,例如:
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

如果你在索引时使用它们,请在分析链定义的末尾放置以下过滤器:

注:请保留HTML标签。

<filter class="solr.FlattenGraphFilterFactory"/>

希望有人能发现这很有用 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接