0

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は、それを完全に削除するための多くの優れた機能を提供すると思いますが、このトークンの位置のシフトは私には正しく見えません。

4

3 に答える 3

1

私は、次のようなフレーズ同義語の「制限」を利用して、同義語を追加する厄介な方法を使用してそれを解決しました。

ps3 => playstation 3, ps 3
ps2 => playstation 2, ps 2

これは、置換(=>)と同義語(コンマで区切られた2つの単語)の両方を使用する一種のハックです。

クエリアナライザは次のようになります。

WhitespaceTokenizerFactory => [pos:1] ps3
ASCIIFoldingFilterFactory  => [pos:1] ps3
SynonymFilterFactory       => [pos:1] ps            [pos:2] 3
                              [pos:1] playstation   [pos:2] 3

StopFilterFactory          => [pos:1] ps            [pos:2] 3
                              [pos:1] playstation   [pos:2] 3

WordDelimiterFilterFactory => [pos:1] ps            [pos:2] 3
                              [pos:1] playstation   [pos:2] 3
...
RemoveDuplicatesTokenFilterFactory =>  [pos:1] ps            [pos:2] 3
                                       [pos:1] playstation   

そしてdebugQuery

<str name="querystring">title_search_pt:(ps3 new)</str>
<str name="parsedquery">+MultiPhraseQuery(title_search_pt:"(playstation ps) 3") +title_search_pt:new</str>

両方の3が同じトークン位置になり、RemoveDuplicatesTokenFilterFactoryによって削除されるため、同義語から3の1つを削除できます。しかし、私はそれをそのように保ったので、私の同義語ファイルはあまり暗号化されていません。

于 2013-03-08T13:14:56.010 に答える
0

WordDelimiterFilterFactoryの属性splitOnNumerics="0"を設定できます

splitOnNumerics = "1"により、アルファベット=>数値遷移が発生し、新しいパーツが生成されます

"j2se" => "j" "2" "se"

デフォルトはtrue( "1"); オフにするには0に設定します

これにより、ps3とplaystation3が2つのトークンに分割されるという問題が解消されます。1つは単語を使用し、もう1つは数値を使用します。

于 2013-03-07T20:06:28.213 に答える
0

あなたの答えを完成させるために:

同義語に入力したすべての単語(または問題を引き起こす単語のみ)をprotwords.txtファイルに追加して、すべてのトークナイザーがそれらを無視し、そのままインデックスを作成するようにすることもできます。

これは、同義語がそのまま検索したい単語であるため、同義語ファイルと組み合わせて使用​​する場合に意味があります。

于 2013-08-05T14:48:26.260 に答える