1. 我在做什么:
我目前正在尝试实现一些流行的同义词,以增加显示的广告数量。
2. 限制:
由于业务逻辑,我的默认运算符是 AND 因此,据我了解,搜索:
“ps3 slim 250gb 新”
应该返回包含该查询中每个术语的项目。我尝试切换到“OR”,但这将返回仅包含“new”或“slim”字样的项目。
由于我们总是按日期而不是按相关性排序,这是一个大问题。所以'和'它是。
这个想法是用大量的同义词和停用词来处理这个问题。
3. 我的设置:
我当前的 SOLR 设置包含以下分析器链:
<fieldtype name="text_pt" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" protected="protwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1"
generateNumberParts="1" preserveOriginal="1" catenateWords="1"
catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="false" words="portugueseStopWords.txt"/>
<filter class="solr.BrazilianStemFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" protected="protwords.txt"/>
<filter class="solr.SynonymFilterFactory" ignoreCase="true" synonyms="portugueseSynonyms.txt"
expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="portugueseStopWords.txt"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
catenateWords="1" preserveOriginal="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.BrazilianStemFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldtype>
4.问题:
我有同义词:
plaistation, plastation => playstation #dirty spelling correction
ps3, playstation3 #just a synonym
第一个只是工作。第二个结果似乎是同义词和 WordDelimiter 之间的冲突,如分析页面和&debugQuery 所示:
调试查询
<str name="querystring">title_search_pt:(ps3)</str>
<str name="parsedquery">MultiPhraseQuery(title_search_pt:"(ps3 ps) (3 playstation3 playstation) 3")</str>
查询分析器
WhitespaceTokenizerFactory => [pos:1] ps3
ASCIIFoldingFilterFactory => [pos:1] ps3
SynonymFilterFactory => [pos:1] ps3
[pos:1] playstation3
StopFilterFactory => [pos:1] ps3
[pos:1] playstation3
WordDelimiterFilterFactory => [pos:1] ps3 [pos:2] 3 [pos:3] 3
[pos:1] ps [pos:2] playstation3
[pos:2] playstation
如您所见,在 WordDelimiterFilter 搞砸之前一切都很好。
我所期待的是ps和playstation都在 pos:1 和 3 在 pos:2。
如果我将“OR”作为默认操作,这将不是问题,但由于这对我来说不可能,这将尝试匹配同时具有 ps3 和 playstation3 的文档,而不是给我更多结果,它甚至给了我较少的..
5.问题:
我能做些什么呢?我认为 WordDelimiterFilter 提供了很多很好的东西来完全删除它,但是这个令牌位置移动对我来说看起来不正确。