2011-02-10 2 views
3

Googleのような自動補完方法の1つは、シングルとソルバー1.4のタームベクトルコンポーネントを組み合わせることです。シングルとタームベクトルコンポーネントによるオートコンプリート

まず、帯状疱疹成分を含むすべてのnグラム分布を生成し、次にtermvectorを使用して、ユーザーの用語シーケンス(文書の頻度に基づく)に最も近い予測を得る。

スキーマ:

<fieldType name="shingle_text_fivegram" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer> 
     <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" /> 
     <filter class="solr.ShingleFilterFactory" maxShingleSize="5" outputUnigrams="false"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 

のSolrの設定:

<searchcomponent name="termsComponent" class="org.apache.solr.handler.component.TermsComponent"/> 
<requesthandler name="/terms" class="org.apache.solr.handler.component.SearchHandler"> 
    <lst name="defaults"> 
     <bool name="terms">true</bool> 
     <str name="terms.fl">shingleContent_fivegram</str> 
    </lst> 
    <arr name="components"> 
     <str>termsComponent</str> 
    </arr> 
</requesthandler> 

Iはnグラムのエッジ上の任意の場所にストップワードドロップすると、n個の内部でそれらを維持する必要があります上記のセットアップで-gram配列。

のシーケンス「インドと中国」から言ってみましょう私は、次の手順が必要です。

india 
china 
india and china 

をし、残りの部分をスキップしてください。

他のSolrコンポーネント/フィルタと組み合わせて使用​​できますか?

UPD:

「あなただけの開始(最初のトークンでストップワードを削除するカスタムストップフィルタを作ることができませんでした(:ここでのLucene 4での一つの可能​​な解決策(SOLRに配線することが可能なはずであるが)であります(キャプチャ/ restorteState)が必要でしたが、実行可能なように見えますか? " - からマイケル・マッカンドレス

:あなたは彼/彼女のタイプのそれのようにユーザーの入力を一致させる必要があるとして、http://blog.mikemccandless.com/2013/08/suggeststopfilter-carefully-removes.html

答えて

1

はSolrの1.4でマルチワードのオートコンプリート行うための最善の方法は、EdgeNGramFilterFactoryです。だから、あなたはインドを示唆するために "i"、 "in" "ind"などとマッチする必要があります。

+1

質問は、マルチワードのオートコンプリート実装する方法ではありません。これは既に行われています。問題は、検索時に、生成されたnグラムの端にストップワードを落とす方法です。 –

1

は(あなたの例を使用して)ので、KeywordTokenizerFactoryで別のクエリアナライザを使用します。

 <analyzer type="index"> 
      <tokenizer class="solr.LowerCaseTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" /> 
      <filter class="solr.ShingleFilterFactory" maxShingleSize="5" outputUnigrams="false"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" /> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
+0

提案してくれてありがとう、私はこれをテストするためにいくつかのデータで遊ぶ必要があります。 –

関連する問題