有没有办法限制 django haystack 索引中边缘 ngram 的大小?例如,我按如下方式创建 ngram:
#search_indexes.py
content_auto = indexes.EdgeNgramField(model_attr='name')
但我不想创建 2 个字母 ngram,我实际上想将最小值设置为 4 或 5。
作为背景,我正在使用 django-haystack/elasticsearch,并在 heroku 上使用盆景。
有没有办法限制 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
导入新的模式映射。
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 后端以自定义搜索映射的文章。
它实际上很简单。search_configuration
只需在模板目录中创建一个名为的文件夹。然后,创建一个文件并将此处solr.xml
的 solr.xml 文件的内容粘贴到该文件中。最后,编辑 以根据需要设置 minGramSize。EdgeNGramFilterFactory