1

名前をオートコンプリートできるようにしたい。

たとえば、名前が の場合、ドキュメントを検索して取得できるようJohn Smithにしたいと考えています。JoSmJohn Sm

jo smまた、ドキュメントの照合はしたくありません。

私は現在、このアナライザーを持っています:

return array(
    'settings' => array(
        'index' => array(
            'analysis' => array(
                'analyzer' => array(
                    'autocomplete' => array(
                        'tokenizer' => 'autocompleteEngram',
                        'filter' => array('lowercase', 'whitespace')
                    )
                ),

                'tokenizer' => array(
                    'autocompleteEngram' => array(
                        'type' => 'edgeNGram',
                        'min_gram' => 1,
                        'max_gram' => 50
                    )
                )
            )   
        )
    )
);

これの問題は、最初にテキストを分割してから、エッジグラムを使用してトークン化することです。

これにより、次のようになります。 j jo joh john s sm smi smit smith

これは、john smithorを検索してjohn smも何も返されないことを意味します。

したがって、次のようなトークンを生成する必要があります j jo joh john s sm smi smit smith john s john sm john smi john smit john smith

これらの余分なトークンを生成するようにアナライザーを設定するにはどうすればよいですか?

4

1 に答える 1

4

私はエッジングラムを使用しなくなりました。

standardトークナイザーstandardlowercaseフィルターを使用してアナライザーを作成しました。これは実質的にstandardアナライザーと同じですが、ストップワード フィルターはありません (名前を検索しているため、誰かが電話をかけている可能性がありますThe) An

次に、上記のアナライザーをindex_analyzerおよびsimpleとして設定しsearch_analyzerます。このセットアップをmatch_phrase_prefixクエリで使用すると、非常にうまく機能しました。

これは私が使用したカスタム アナライザーです (オートコンプリートと呼ばれ、PHP で表現されます)。

'autocomplete' => array(
                        'tokenizer' => 'standard',
                        'filter' => array('standard', 'lowercase')
                ),
于 2013-06-10T07:10:55.350 に答える