solr 具有空格或多个单词的概念的同义词

s2j5cfk0  于 2022-11-05  发布在  Solr
关注(0)|答案(4)|浏览(158)

我不知道如何处理包含空格的同义词!我有以下配置:
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>

我的档案:syn.txt

st., st => saint
istambul => istanbul
airport, apt => aéroport
NYC => New York
pt., pt => port
brussels => bruxelles

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

"NYC => New York"

我做了一些研究,发现了以下内容:
请记住,虽然SynonymFilter可以很好地处理包含多个单词的同义词(即:“海饼干、海饼干、海饼干”)
处理此类同义词的建议方法是在编制索引时展开同义词。这是因为在查询时可能会出现两个潜在问题:
Lucene QueryParser在将任何文本提供给分析器之前会对白色进行标记化,因此,如果用户搜索单词sea biscit,分析器将分别获得单词“sea”和“biscit”,并且不会知道它们是否匹配同义词。
短语搜索(即:“sea biscit”)将导致QueryParser将整个字符串传递给分析器,但是如果SynonymFilter被配置为展开同义词,那么当QueryParser从分析器中获取得到的标记列表时,它将构造一个MultiPhraseQuery,而该MultiPhraseQuery将不会产生预期的效果。
这是因为分析器可用于指示两个术语占据相同位置的机制有限:没有办法指示“短语”占据与术语相同的位置。
对于我们的示例,得到的MultiPhraseQuery将是“(sea|浪|海饼干|biscit)”,这与文档中出现的“seabiscuit”的简单情况不匹配
所以我试着改变我的配置文件,并在索引中添加我的过滤器,但它不起作用。
有人有什么想法吗?

7d7tgy0s

7d7tgy0s1#

您正在使用=>执行显式Map。
Solr文档中说
显式Map将LHS上的任何标记序列“=〉”和replace与RHS上的所有替代项匹配。这些类型的Map忽略模式中的expand参数。
所以我猜如果你搜索NYC,你什么也得不到,因为它在索引时被New York替换了。
相反,您可以尝试将它们声明为等效同义词吗?例如,像NYC, New York而不是NYC => New York
那么我相信你可以搜索他们中的任何一个,结果都会是一样的。

pkln4tw6

pkln4tw62#

问题是,当第一个短语中的单词数量少于第二个短语中的单词数量时,solr同义词往往会导致问题。当这种情况发生时,标记会溢出到其他标记的位置。

我有一个解决这个问题的方法,但是它需要在索引和查询时使用两次solr.SynonymFilterFactory

就像这样:

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

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

在第一个筛选器中,您将拥有:纽约=〉纽约
在第二个筛选器中:NYC =〉约克
现在,搜索纽约将返回包含NYC和Vice诗句的结果。
最后一点:此方法只有在索引和查询时才有效。

ru9i0ody

ru9i0ody3#

内容

st., st => saint

我想你应该这样做:

st. => saint
st => saint

内容

NY => New York

我也遇到了类似的问题,并得出结论,这是因为解析是在同义词替换之前完成的,这可能会在多词时导致问题。我发现可以在SynonymFactory中包含一个解析器:

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.KeywordTokenizerFactory" />

我刚刚测试了它,我得到了更好的结果,但还没有一个预期的。奇怪的是,当添加KeywordTokenizerFactory似乎有积极的影响,添加WhitespaceTokenizerFactory或StandardTokenizerFactory似乎没有改变任何东西。
顺便说一句,如果不使用木瓦,这应该已经很好了。

hwamh0ep

hwamh0ep4#

根据Shadoko教授的回答:
观察分析仪的工作方式,例如,使用

http://localhost/solr/analysis/field?analysis.fieldvalue=EXAMPLE-KEYWORDS&q=EXAMPLE-KEYWORD%203&analysis.fieldname=EXAMPLEFIELD&analysis.showmatch=true

analysis/field是一个开箱即用的请求处理程序(位于solrconfig.xml中)。Here您可以找到它的参数列表。(“analysis.query”对我不起作用,所以我不得不使用“q”)
由于SynonymFilter在匹配任何同义词之前解析(剪切)传入的文本,因此多词同义词不会命中。诀窍是告诉SynonymFilter接受一个解析器,而该解析器实际上并不进行解析:关键字标记器

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.KeywordTokenizerFactory" />

无论如何,这种方法感觉像一个黑客,我不能估计的副作用(可伸缩性,...)-所以要小心!

相关问题