有没有一种方法可以限制Django Haystack索引中边缘ngram的大小?例如,我创建ngram如下:
#search_indexes.py content_auto = indexes.EdgeNgramField(model_attr='name')
但我不想创建2个字母ngram,实际上我想将最小设置为4或5。
作为背景,我使用的是django-haystack / elasticsearch,并在heroku上使用了盆景。
您需要做的是覆盖Haystack的ElasticSearch后端中的搜索映射。
简而言之:扩展ElasticSearch后端,并直接替换或通过settings.py导入新模式映射进行替换。
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后端以自定义搜索映射。