solr中的多字同义词

mid*_*nig 7 solr synonym

我正在尝试在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"的每次命中.

我怎么解决这个问题?

Ion*_*aru 1

来自 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来为您执行此操作。您可以在这里找到更多信息。

  • 看起来有一个针对 https://issues.apache.org/jira/browse/SOLR-5379 提交的补丁可以解决相同的问题。另请检查相关的 jira 问题以获取更多信息。祝你好运 (3认同)