我正在尝试在solr中实现多字同义词,特别是类型
msc divina => divina
Run Code Online (Sandbox Code Playgroud)
因此,如果用户输入"msc divina",则solr应仅返回"divina"的结果.
schema.xml中的定义如下所示:
<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100"
autoGeneratePhraseQueries="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.SynonymFilterFactory"
synonyms="synonyms_de.txt"
ignoreCase="true"
expand="false" />
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords_de.txt"
enablePositionIncrements="true" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="1"
catenateAll="0"
splitOnCaseChange="1" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.KeywordMarkerFilterFactory"
protected="protwords_de.txt" />
<filter class="solr.SnowballPorterFilterFactory" language="German2" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords_de.txt"
enablePositionIncrements="true" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1"
generateNumberParts="1"
catenateWords="0"
catenateNumbers="0"
catenateAll="0"
splitOnCaseChange="1" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.KeywordMarkerFilterFactory"
protected="protwords_de.txt" />
<filter class="solr.SnowballPorterFilterFactory" language="German2" />
</analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)
它不起作用.如果我向查询分析器添加同义词过滤器,搜索"msc divina"将返回"msc and"divina"的每次命中.
我怎么解决这个问题?
来自 Solr文档:
请记住,虽然 SynonymFilter 很乐意处理包含多个单词的同义词(即:“sea biscuit,sea biscit,seabiscuit”),但处理此类同义词的推荐方法是在索引时扩展同义词。这是因为查询时可能会出现两个潜在问题:
Lucene QueryParser 在向分析器提供任何文本之前对空白进行标记,因此,如果一个人搜索单词 sea biscit,分析器将分别给出单词“sea”和“biscit”,并且不会知道它们与同义词匹配。短语搜索(即:“sea biscit”)将导致 QueryParser 将整个字符串传递给分析器,但如果 SynonymFilter 配置为扩展同义词,那么当 QueryParser 从分析器获取标记结果列表时,它会将构造一个不会达到预期效果的 MultiPhraseQuery。这是因为分析器可用于指示两个术语占据相同位置的机制有限:无法指示“短语”与术语占据相同位置。对于我们的示例,生成的 MultiPhraseQuery 将是“(sea | sea | seabiscuit) (biscuit | biscit)”,这与文档中出现的“seabiscuit”的简单情况不匹配
在这里,他们描述了一个问题:除非您使用,否则您无法在索引上搜索sea biscit并获取匹配项,但他们还解释了在查询时使用多词查询(这就是您的情况)时发生的情况。seabiscuitexpand=true
msc divina -> msc | divina - phrase query
Run Code Online (Sandbox Code Playgroud)
它将匹配 msc 和 divina 文档。如果您可以在查询时指定您的搜索"msc divina"将起作用。
否则,您在查询时需要一个多词感知分词器,或者您可以扩展插件FieldQParser来为您执行此操作。您可以在这里找到更多信息。
| 归档时间: |
|
| 查看次数: |
4327 次 |
| 最近记录: |