6

EdgeNgramが数値を処理する方法について何かアイデアはありますか?

ElasticSearchバックエンドでhaystackを実行しています。EdgeNgramタイプのインデックス付きフィールドを作成しました。このフィールドには、数字だけでなく単語も含まれる可能性のある文字列が含まれます。

部分的な単語を使用してこのフィールドに対して検索を実行すると、想定どおりに機能します。しかし、部分的な数値を入力すると、希望する結果が得られません。

例:

「edgen」と入力してインデックス付きフィールド「EdgeNgram12323」を検索すると、インデックスが返されます。「123」と入力して同じインデックスを検索しても、何も表示されません。

考え?

4

2 に答える 2

4

Haystack + Elasticsearchでこの同じ問題を解決しようとして、ここで自分の道を見つけました。ubonessとComoWhatからのヒントに従って、EdgeNGramフィールドが数値文字列を単語のように処理するようにする代替のHaystackエンジンを作成しました。他の人が恩恵を受けるかもしれないので、私はそれを共有したいと思いました。

from haystack.backends.elasticsearch_backend import ElasticsearchSearchEngine, ElasticsearchSearchBackend

class CustomElasticsearchBackend(ElasticsearchSearchBackend):
    """
    The default ElasticsearchSearchBackend settings don't tokenize strings of digits the same way as words, so emplids
    get lost: the lowercase tokenizer is the culprit. Switching to the standard tokenizer and doing the case-
    insensitivity in the filter seems to do the job.
    """
    def __init__(self, connection_alias, **connection_options):
        # see http://stackoverflow.com/questions/13636419/elasticsearch-edgengrams-and-numbers
        self.DEFAULT_SETTINGS['settings']['analysis']['analyzer']['edgengram_analyzer']['tokenizer'] = 'standard'
        self.DEFAULT_SETTINGS['settings']['analysis']['analyzer']['edgengram_analyzer']['filter'].append('lowercase')
        super(CustomElasticsearchBackend, self).__init__(connection_alias, **connection_options)

class CustomElasticsearchSearchEngine(ElasticsearchSearchEngine):
    backend = CustomElasticsearchBackend
于 2014-05-02T06:59:26.977 に答える
3

edgeNGramトークナイザーを使用している場合は、「EdgeNGram 12323」を単一のトークンとして扱い、edgeNGramのプロセスを適用します。たとえば、min_grams = 1 max_grams = 4の場合、次のトークンにインデックスが付けられます:["E"、 "Ed"、 "Edg"、"Edge"]。したがって、これは実際に探しているものではないと思います。代わりに、edgeNGramトークンフィルターの使用を検討してください。

edgeNGramトークンフィルターを使用している場合は、テキスト「EdgeNGram 12323」を実際にトークン化して、そこから2つのトークンを生成するトークナイザーを使用していることを確認してください:["EdgeNGram"、 "12323"](標準または空白のトークナイザーはトリックを行います)。次に、その隣にedgeNGramフィルターを適用します。

一般に、edgeNGramは「12323」を取り、「1」、「12」、「123」などのトークンを生成します。

于 2012-11-30T00:31:13.927 に答える