【问题标题】:Search for a mix of numbers and chars with haystack (elasticsearch)使用 haystack (elasticsearch) 搜索数字和字符的混合
【发布时间】:2015-08-29 11:41:54
【问题描述】:

我将 Django Haystack 与 Elasticsearch 一起使用。我有一个名为“code”的字符串字段,格式如下:

76-010

我希望能够搜索

76-

得到结果

76-111

76-110

76-210

...

等等。

但我不想得到这些结果:

11-760

11-076
...

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

class ConfigurableElasticBackend(ElasticsearchSearchBackend):

    def __init__(self, connection_alias, **connection_options):
        # see http://stackoverflow.com/questions/13636419/elasticsearch-edgengrams-and-numbers
        self.DEFAULT_SETTINGS['settings']['analysis']['analyzer']['edgengram_analyzer']['tokenizer'] = 'standard'
        self.DEFAULT_SETTINGS['settings']['analysis']['analyzer']['edgengram_analyzer']['filter'].append('lowercase')
        super(ConfigurableElasticBackend, self).__init__(connection_alias, **connection_options)

【问题讨论】:

  • 你见过this article吗,因为它显示的内容几乎就是你所需要的。

标签: django elasticsearch django-haystack


【解决方案1】:

我们的想法是使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 2011-03-26
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多