使用 django haystack 自动完成功能和 elasticsearch 来搜索数字/数字?

2024-03-01

我正在使用 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 分词器默认为“小写”,这会完全丢弃数字。

所以,我发现弹性叠层 https://github.com/bennylope/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 元语法,然后使用标准匹配搜索?任何帮助将不胜感激。

多谢!


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 django haystack 自动完成功能和 elasticsearch 来搜索数字/数字? 的相关文章

随机推荐