我正在使用Django Haystack和Elasticsearch。我有一个名为'code'的字符串字段,格式如下:
76-010
我希望能够搜索
76 -
得到结果
76-111
76-110
76-210
...
等等。
但我不想得到这些结果:
11-760
11-076
...
我已经有了自定义弹性搜索后端,但我不确定应该如何对其进行索引以获得所需的行为。
mvn 3.2.1
答案 0 :(得分:0)
我们的想法是使用edgeNGram
tokenizer来索引code
字段的每个前缀。例如,我们希望将76-111
编入索引为7
,76
,76-
,76-1
,76-11
和76-111
。通过这种方式,您可以通过搜索任何前缀找到766-11
。
请注意,this article为您的问题提供了全面的解决方案。您的案例的索引设置在Django代码中将如下所示。然后你可以按照那篇文章进行总结,但这应该可以让你开始。
class ConfigurableElasticBackend(ElasticsearchSearchBackend):
DEFAULT_SETTINGS = {
"settings": {
"analysis": {
"analyzer": {
"edgengram_analyzer": {
"tokenizer": "edgengram_tokenizer",
"filter": [ "lowercase" ]
}
},
"tokenizer": {
"edgengram_tokenizer": {
"type": "edgeNGram",
"min_gram": "1",
"max_gram": "25"
}
}
}
},
"mappings": {
"your_type": {
"properties": {
"code": {
"type": "string",
"analyzer": "edgengram_analyzer"
}
}
}
}
}
def __init__(self, connection_alias, **connection_options):
super(ConfigurableElasticBackend, self).__init__(connection_alias, **connection_options)
self.conn = pyelasticsearch.ElasticSearch(connection_options['URL'], timeout=self.timeout)
self.index_name = connection_options['INDEX_NAME']
# create the index with the above settings
self.conn.create_index(self.index_name, self.DEFAULT_SETTINGS)