1.私がしていること:
私は現在、表示される広告の量を増やすために、いくつかの人気のある同義語を実装しようとしています。
2.制限:
ビジネスロジックにより、私のデフォルトの演算子はANDであるため、私が理解しているように、次を検索します。
「ps3スリム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
最初のものはうまくいきます。2番目の結果は、分析ページと&debugQueryの両方に見られるように、同義語とWordDelimiterの間の競合のように見えるものになります。
デバッグクエリ
<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がそれを台無しにするまではすべて良かったです。
私が期待していたのは、pos:1のpsとプレイステーション、そしてpos:2の3の両方でした。
デフォルトの操作として「OR」を使用している場合、これは問題にはなりませんが、これは不可能であるため、ps3とplaystation3の両方を持つドキュメントを照合しようとします。これにより、より多くの結果が得られる代わりに、さらに多くの結果が得られます。以下..
5.質問:
これについて私は何ができますか?WordDelimiterFilterは、それを完全に削除するための多くの優れた機能を提供すると思いますが、このトークンの位置のシフトは私には正しく見えません。