我不知道如何处理包含空格的同义词!我有以下配置:
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”的简单情况不匹配
所以我试着改变我的配置文件,并在索引中添加我的过滤器,但它不起作用。
有人有什么想法吗?
4条答案
按热度按时间7d7tgy0s1#
您正在使用
=>
执行显式Map。Solr文档中说
显式Map将LHS上的任何标记序列“=〉”和
replace
与RHS上的所有替代项匹配。这些类型的Map忽略模式中的expand参数。所以我猜如果你搜索
NYC
,你什么也得不到,因为它在索引时被New York
替换了。相反,您可以尝试将它们声明为等效同义词吗?例如,像
NYC, New York
而不是NYC => New York
。那么我相信你可以搜索他们中的任何一个,结果都会是一样的。
pkln4tw62#
问题是,当第一个短语中的单词数量少于第二个短语中的单词数量时,solr同义词往往会导致问题。当这种情况发生时,标记会溢出到其他标记的位置。
我有一个解决这个问题的方法,但是它需要在索引和查询时使用两次solr.SynonymFilterFactory。
就像这样:
在第一个筛选器中,您将拥有:纽约=〉纽约
在第二个筛选器中:NYC =〉约克
现在,搜索纽约将返回包含NYC和Vice诗句的结果。
最后一点:此方法只有在索引和查询时才有效。
ru9i0ody3#
内容
我想你应该这样做:
内容
我也遇到了类似的问题,并得出结论,这是因为解析是在同义词替换之前完成的,这可能会在多词时导致问题。我发现可以在SynonymFactory中包含一个解析器:
我刚刚测试了它,我得到了更好的结果,但还没有一个预期的。奇怪的是,当添加KeywordTokenizerFactory似乎有积极的影响,添加WhitespaceTokenizerFactory或StandardTokenizerFactory似乎没有改变任何东西。
顺便说一句,如果不使用木瓦,这应该已经很好了。
hwamh0ep4#
根据Shadoko教授的回答:
观察分析仪的工作方式,例如,使用
analysis/field是一个开箱即用的请求处理程序(位于solrconfig.xml中)。Here您可以找到它的参数列表。(“analysis.query”对我不起作用,所以我不得不使用“q”)
由于SynonymFilter在匹配任何同义词之前解析(剪切)传入的文本,因此多词同义词不会命中。诀窍是告诉SynonymFilter接受一个解析器,而该解析器实际上并不进行解析:关键字标记器
无论如何,这种方法感觉像一个黑客,我不能估计的副作用(可伸缩性,...)-所以要小心!