5

django haystack インデックス作成でエッジ ngram のサイズを制限する方法はありますか? たとえば、次のように ngram を作成します。

#search_indexes.py
content_auto = indexes.EdgeNgramField(model_attr='name')

しかし、私は 2 文字の ngram を作成したくありません。実際には最小値を 4 または 5 に設定したいと考えています。

背景として、私はherokuの盆栽でdjango-haystack/elasticsearchを使用しています。

4

2 に答える 2

5

必要なことは、Haystack の ElasticSearch バックエンドで検索マッピングをオーバーライドすることです。

簡単に言うと、ElasticSearch バックエンドを拡張し、直接置き換えるかsettings.py、新しいスキーマ マッピングをインポートすることによって行います。

from django.conf import settings
from haystack.backends.elasticsearch_backend import (ElasticsearchSearchBackend,
    ElasticsearchSearchEngine)

class MyElasticBackend(ElasticsearchSearchBackend):

    def __init__(self, connection_alias, **connection_options):
        super(ConfigurableElasticBackend, self).__init__(
                                connection_alias, **connection_options)
        MY_SETTINGS = {
            'settings': {
                "analysis": {
                    "analyzer": {
                        "ngram_analyzer": {
                            "type": "custom",
                            "tokenizer": "lowercase",
                            "filter": ["haystack_ngram"]
                        },
                        "edgengram_analyzer": {
                            "type": "custom",
                            "tokenizer": "lowercase",
                            "filter": ["haystack_edgengram"]
                        }
                    },
                    "tokenizer": {
                        "haystack_ngram_tokenizer": {
                            "type": "nGram",
                            "min_gram": 3,
                            "max_gram": 15,
                        },
                        "haystack_edgengram_tokenizer": {
                            "type": "edgeNGram",
                            "min_gram": 2,
                            "max_gram": 15,
                            "side": "front"
                        }
                    },
                    "filter": {
                        "haystack_ngram": {
                            "type": "nGram",
                            "min_gram": 3,
                            "max_gram": 15
                        },
                        "haystack_edgengram": {
                            "type": "edgeNGram",
                            "min_gram": 5,
                            "max_gram": 15
                        }
                    }
                }
            }
        }
        setattr(self, 'DEFAULT_SETTINGS', MY_SETTINGS)


class ConfigurableElasticSearchEngine(ElasticsearchSearchEngine):
    backend = MyElasticBackend

詳細な説明については、ElasticSearch バックエンドを拡張して検索マッピングをカスタマイズすることについての私の記事を参照してください。

于 2013-09-20T12:18:11.570 に答える