3

Google のような自動補完を実現する方法の 1 つは、Solr 1.4 でシングルと termvector コンポーネントを組み合わせることです。

最初に、シングルス コンポーネントを使用してすべての n-gram 分布を生成し、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>

上記のセットアップでは、ストップワードを n グラムの端のどこかにドロップし、n グラム シーケンス内に保持する必要があります。

「インドと中国」のシーケンスから、次のシーケンスが必要だとしましょう。

india
china
india and china

残りをスキップします。

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

UPD: Lucene 4 で考えられる解決策の 1 つを次に示します (SOLR に接続できるはずです)。

「開始時(最初のトークンが表示される)または入力の終了時(後に非ストップワード トークンが表示されない)でストップ ワードのみを削除するカスタム ストップ フィルタを作成できませんか?バッファリング / 状態保持が必要でした。 (capture/restoreteState) でも実行可能に見えますか?」-- マイケル・マッカンドレス

から: http://blog.mikemccandless.com/2013/08/suggeststopfilter-carefully-removes.html

4

2 に答える 2

1

Solr 1.4でマルチワードオートコンプリートを実行する最良の方法は、EdgeNGramFilterFactoryを使用することです。これは、ユーザー入力を入力するときにユーザー入力を一致させる必要があるためです。したがって、インドを提案するには、「i」、「in」、「ind」などと一致させる必要があります。

于 2011-08-10T00:24:01.843 に答える
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>
于 2014-10-07T13:23:25.923 に答える