用haystack搜索数字和字符的混合(elasticsearch)

时间:2015-08-27 00:09:05

标签: django elasticsearch django-haystack

我正在使用Django Haystack和Elasticsearch。我有一个名为'code'的字符串字段,格式如下:

  

76-010

我希望能够搜索

  

76 -

得到结果

  

76-111

     

76-110

     

76-210

     

...

     

等等。

但我不想得到这些结果:

  

11-760

     

11-076
  ...

我已经有了自定义弹性搜索后端,但我不确定应该如何对其进行索引以获得所需的行为。

mvn 3.2.1

1 个答案:

答案 0 :(得分:0)

我们的想法是使用edgeNGram tokenizer来索引code字段的每个前缀。例如,我们希望将76-111编入索引为77676-76-176-1176-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)