使用带有elasticsearch的django haystack自动完成来搜索数字/数字?

时间:2014-09-13 21:16:11

标签: django autocomplete elasticsearch django-haystack digits

我使用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然后使用标准匹配搜索?任何帮助将不胜感激。

非常感谢!

1 个答案:

答案 0 :(得分:-1)

有一个解决方案可以帮助我: http://silentsokolov.github.io/2014/09/03/django-haystack-elasticsearch-prombiemy-avtodopolnieniia.html

该文件是用俄语写的,所以请使用谷歌翻译。