Solr - 包含多个单词的同义词

Joh*_*ith 10 solr synonym

快速提问,我不知道如何处理包含空格的同义词!我有以下配置:

SOLR配置文件

<fieldType ... >
  <analyzer type="index">
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" 
                            catenateWords="1" 
                            preserveOriginal="1"
                            splitOnCaseChange="1"
                            generateWordParts="1" 
                            generateNumberParts="1"         
                            catenateNumbers="1" 
                            catenateAll="1" 
                            />
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30" side="front"/>
  </analyzer>
  <analyzer type="query">    
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LengthFilterFactory" min="2" max="70" />
    <filter class="solr.SynonymFilterFactory" synonyms="syn.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
 </analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)

我的文件:syn.txt

st., st => saint
istambul => istanbul
airport, apt => aéroport
NYC => New York
pt., pt => port
brussels => bruxelles
Run Code Online (Sandbox Code Playgroud)

一切都很好,除了同义词:

"NYC => New York"
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,发现了以下内容:

请记住,虽然SynonymFilter会很乐意使用包含多个单词的同义词(例如:"sea biscuit,sea biscit,seabiscuit")

处理这样的同义词的推荐方法是在索引时扩展同义词.这是因为在查询时可能会出现两个潜在的问题:

在向分析器提供任何文本之前,Lucene QueryParser会在空格上进行标记,因此如果某人搜索单词sea biscit,分析器将分别给出单词"sea"和"biscit",并且不会知道它们与同义词匹配.

短语搜索(即:"sea biscit")将导致QueryParser将整个字符串传递给分析器,但是如果SynonymFilter配置为扩展同义词,那么当QueryParser从分析器获取结果的标记列表时,它将构造一个不具有所需效果的MultiPhraseQuery.

这是因为分析仪可用的机制有限,表明两个术语占据相同的位置:没有办法表明"短语"占据与术语相同的位置.

对于我们的例子,得到的MultiPhraseQuery将是"(sea | sea | seabiscuit)(饼干| biscit)",这与文档中出现的"seabiscuit"的简单情况不符

所以我试图更改我的配置文件并在索引处添加我的过滤器,但它无法正常工作.

有什么想法吗?

aru*_*run 7

您正在使用显式映射=>.

Solr的文件说,

显式映射匹配LHS"=>"上的任何标记序列,并替换为RHS上的所有备选项.这些类型的映射忽略架构中的expand参数.

所以我猜测,如果你搜索NYC你什么都没有回来,因为它New York在索引时被取代了.

相反,你能尝试将它们声明为等同的同义词吗?即喜欢 NYC, New York而不是NYC => New York.

然后我相信你可以搜索其中任何一个,结果将是相同的.