13

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

我们,美国,美国

我的理解是,将其添加到同义词文件将允许用户搜索美国,并获取包含美国或美国的文档。如果用户放入美国或美国,情况同上。

不幸的是,有了这个,当我进行搜索时,我会得到包含所有三个单词的项目的结果——它是对同义词进行 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,但我希望同义词过滤器能够理解这一点。

4

3 回答 3

23

尝试仅在索引期间使用 SynonymFilterFactory,而不是在查询期间。

文档也表明了这一点: http ://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory

于 2012-01-14T03:56:53.310 回答
8

为了更好地理解同义词搜索,请按照下面的逐步实现过程(我使用的是solr 6.5.* 版本):

第1步:

下载country-synonyms.txt文本文件并将其放在以下路径中:

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

yourCore:核心名称应相应更改

第2步:

在上述相同路径中的托管模式文件中添加字段类型:

<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>

第 3 步:在同一文件(托管模式)中 添加您的字段(国籍),类型为国家。

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

第四步: 重启solr。

solr restart -p <your solr port>

第 5 步:

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

第 6 步:

现在查询以下案例并进行测试:

查询

  1. 国籍:美国
  2. 国籍:美国
  3. 国籍:美国
  4. 国籍:美国

以上所有查询都会给你相同的结果。

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

于 2017-06-21T05:30:10.863 回答
1

为了从较新的 Solr 角度完成答案,我想在同义词方面添加一件事。Solr 的最新版本在查询和索引期间正确处理多词同义词。

要使用新的同义词实现,您必须使用不同的过滤器,例如:

<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

此外,如果您在索引期间使用它们,请将以下过滤器放在分析链定义的末尾:

<filter class="solr.FlattenGraphFilterFactory"/>

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

于 2020-03-25T19:21:46.637 回答