我正在尝试在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,但我希望同义词过滤器能够理解这一点。
答案 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步:
现在查询下面的案例并测试:
<强>查询强>:
以上所有查询都会给你相同的结果。
注意:***仅在执行上述步骤(包括solr restart)后导入数据。它可能不适用于现有数据(有关详细信息,请参阅:AnalyzersTokenizersTokenFilters)
答案 2 :(得分:1)
为了从较新的Solr角度完成答案,我想在涉及同义词时添加一件事。 Solr的最新版本可以在查询和索引期间正确处理多词同义词。
要使用新的同义词实现,您将不得不使用其他过滤器,例如:
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
如果您在 index 时间内使用它们,请将以下过滤器放在分析链定义的末尾:
<filter class="solr.FlattenGraphFilterFactory"/>
希望有人会发现它有用:)