如何使solr同义词起作用

时间:2012-01-14 00:03:09

标签: solr synonym

我正在尝试在Solr中设置一些基本的同义词。我一直在努力的是:<​​/ p> 我们,美国,美国

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

不幸的是,有了这个,当我进行搜索时,我会得到包含所有三个单词的项目的结果 - 它正在对同义词进行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 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:5)

为了更好地理解同义词搜索,请按照以下步骤逐步实施(我使用 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步: 在同一个文件(managed-schema)中添加类型为 country 的字段(国籍)。

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

第4步: 重启solr。

solr restart -p <your solr port>

第5步:

现在使用包含国籍。***

的字段导入您的数据

第6步:

现在查询下面的案例并测试:

<强>查询

  1. 国籍:美国
  2. 国籍:美国
  3. 国籍:美国
  4. 国籍:美利坚合众国
  5. 以上所有查询都会给你相同的结果。

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

答案 2 :(得分:1)

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

要使用新的同义词实现,您将不得不使用其他过滤器,例如:

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

如果您在 index 时间内使用它们,请将以下过滤器放在分析链定义的末尾:

<filter class="solr.FlattenGraphFilterFactory"/>

希望有人会发现它有用:)