我使用Elasticsearch支持的Django Haystack进行自动填充,我在搜索字段中的数字时遇到问题。
例如,我有一个名为' name'在具有如下值的对象类型上:
['NAME', 'NAME2', 'NAME7', 'ANOTHER NAME 8', '7342', 'SOMETHING ELSE', 'LAST ONE 7']
我希望使用自动填充功能搜索所有带有数字' 7'在名称中。
我已使用此字段设置了search_index:
name_auto = indexes.EdgeNgramField(model_attr='name')
我正在使用像这样的搜索查询:
SearchQuerySet().autocomplete(name_auto='7')
但是,此搜索不会返回任何结果。我相信这是因为elasticsearch的edge-ngram tokenizer默认为" lowercase&#34 ;,它会完全抛出数字。
所以,我找到elasticstack,它允许自定义haystack / elasticsearch后端,但我似乎无法正确配置ELASTICSEARCH_INDEX_SETTINGS以获得我想要的功能。
默认设置如下所示:
ELASTICSEARCH_INDEX_SETTINGS = {
'settings': {
"analysis": {
"analyzer": {
"synonym_analyzer" : {
"type": "custom",
"tokenizer" : "standard",
"filter" : ["synonym"]
},
"ngram_analyzer": {
"type": "custom",
"tokenizer": "lowercase",
"filter": ["haystack_ngram", "synonym"]
},
"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": 2,
"max_gram": 15
},
"synonym" : {
"type" : "synonym",
"ignore_case": "true",
"synonyms_path" : "synonyms.txt"
}
}
}
}
}
我试图以多种方式改变edgengram_analyzer块而没有成功,并添加了类似的东西
"token_chars": [ "letter", "digit" ]
到" haystack_ngram_tokenizer"也没有用过。
有人可以帮我确定如何使用haystack / elasticsearch / autocomplete来搜索数字吗?或者我是否必须拆分名称'字段到我自己的所有可能的n-gram然后使用标准匹配搜索?任何帮助将不胜感激。
非常感谢!
答案 0 :(得分:-1)
有一个解决方案可以帮助我: http://silentsokolov.github.io/2014/09/03/django-haystack-elasticsearch-prombiemy-avtodopolnieniia.html
该文件是用俄语写的,所以请使用谷歌翻译。