5

EdgeNGramsを使用してSolrで自動補完検索に取り組んでいます。ユーザーが従業員の名前を検索している場合は、オートコンプリートを適用する必要があります。つまり、結果を Google 検索のようにしたいのです。一部の検索では問題なく動作しています。

ファイルschema.xml:

<fieldType name="edgytext" class="solr.TextField" positionIncrementGap="100" omitNorms="true">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="15" side="front" />
    </analyzer>

<field name="title" type="edgytext" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true"/>
<field name="empname" type="edgytext" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true" />

<field name="autocomplete_text" type="edgytext" indexed="true" stored="false"  multiValued="true" omitNorms="true" omitTermFreqAndPositions="false" />
<copyField source="empname" dest="autocomplete_text"/>

<copyField source="title" dest="autocomplete_text"/>

 http://local:8080/test/suggest/?q=michael

結果:

<?xml version="1.0" encoding="UTF-8" ?>
<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">1</int>
    </lst>
    <result name="response" numFound="0" start="0" />
    <lst name="spellcheck">
        <lst name="suggestions">
            <lst name="michael">
                <int name="numFound">9</int>
                <int name="startOffset">0</int>
                <int name="endOffset">7</int>
                <arr name="suggestion">
                    <str>michael bolton</str>
                    <str>michael foret</str>
                    <str>michael houser</str>
                    <str>michael o'brien</str>
                    <str>michael penn</str>
                    <str>michael row your boat ashore</str>
                    <str>michael tilson thomas</str>
                    <str>michael w. smith</str>
                    <str>michael w. smith featuring andrae crouch</str>
                </arr>
            </lst>
            <str name="collation">michael bolton</str>
        </lst>
    </lst>
</response>

それは私にとってはうまくいっています。で検索するとmichael f

http:// local:8080/test/suggest/?q=michael f

次のような応答が返されます。

<?xml version="1.0" encoding="UTF-8" ?>
<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">1</int>
    </lst>
    <result name="response" numFound="0" start="0" />
    <lst name="spellcheck">
        <lst name="suggestions">
            <lst name="michael">
                <int name="numFound">9</int>
                <int name="startOffset">0</int>
                <int name="endOffset">7</int>
                <arr name="suggestion">
                    <str>michael bolton</str>
                    <str>michael foret</str>
                    <str>michael houser</str>
                    <str>michael o'brien</str>
                    <str>michael penn</str>
                    <str>michael row your boat ashore</str>
                    <str>michael tilson thomas</str>
                    <str>michael w. smith</str>
                    <str>michael w. smith featuring andrae crouch</str>
                </arr>
            </lst>
            <lst name="f">
                <int name="numFound">10</int>
                <int name="startOffset">8</int>
                <int name="endOffset">9</int>
                <arr name="suggestion">
                    <str>f**k the facts</str>
                    <str>fairest lord jesus</str>
                    <str>fatboy slim</str>
                    <str>ffh</str>
                    <str>fiona apple</str>
                    <str>foo fighters</str>
                    <str>frank sinatra</str>
                    <str>frans bauer</str>
                    <str>franz ferdinand</str>
                    <str>françois rauber</str>
                </arr>
            </lst>
            <str name="collation">michael bolton f**k the facts</str>
        </lst>
    </lst>
</response>.

michael fそれから検索すると、私michael foretだけが得られるはずです。来るデータは で始まりfます。Solr の構成設定に何か問題がありますか?

4

1 に答える 1

7

私は[古いリンク]に、Solrを使用して自動提案を行うさまざまな方法と、正しい選択を行うために自分自身に尋ねる必要のあるいくつかの質問について書きました。簡単に言うと、すぐに使用できる方法は次のとおりです。

  • ファセットプレフィックス
  • NGrams
  • 用語コンポーネント
  • 提案者

それらはすべて同時に利点と制限があります。記事を読むことをお勧めします。

さらに作業が必要な完全で柔軟なソリューションをお探しの場合は、この記事もご覧ください。

すでにNGramsを使用することにした場合は、例を挙げて、MinGramSize 1でEdgeNGramFilterFactoryを使用して従業員にインデックスを付けそのフィールドを検索して自動提案を行うことができます。クライアント部分には、JavaScriptを使用する必要があります。

于 2012-08-01T07:40:42.750 に答える