【问题标题】:Range query with elasticsearch for string使用 elasticsearch 对字符串进行范围查询
【发布时间】:2016-12-14 17:17:32
【问题描述】:

我正在尝试将范围查询与 elasticsearch 一起使用

{
    "query": {
        "range": {
             "order_no": {
                 "gte": "VM-0001",
                 "lte": "VM-0005"
             }
         }
    }
}

但是弹性没有返回结果。我发现系统存在字符串问题,包括 -_

这是该字段的映射:

"order_no" : {
      "type" : "string",
      "index_analyzer" : "str_index_analyzer",
      "search_analyzer" : "str_search_analyzer"
}

{
  "analysis": {
    "analyzer": {
      "str_search_analyzer": {
        "tokenizer": "keyword",
        "filter": [
          "lowercase"
        ]
      },
      "str_index_analyzer": {
        "tokenizer": "keyword",
        "filter": [
          "lowercase",
          "substring"
        ]
      }
    },
    "filter": {
      "substring": {
        "type": "nGram",
        "min_gram": 1,
        "max_gram": 20
      }
    }
  }
}

【问题讨论】:

    标签: elasticsearch range-query


    【解决方案1】:

    根据the documentation,对于string 字段,Elasticsearch 使用TermRangeQuery,据我所知,它不会分析要搜索的术语。这意味着您的范围 VM-0001 - VM-0005 会准确搜索这些术语。而您的索引中有类似vm-0001(小写)的东西。所以,要么使用:

    {
      "query": {
        "range": {
          "order_no": {
            "gte": "vm-0001",
            "lte": "vm-0005"
          }
        }
      }
    }
    

    或在索引中添加另一个字段,将 order_no 保留为关键字,无需任何小写或 nGram-atization。

    【讨论】:

    • :) 非常感谢。我成功了。
    【解决方案2】:
    {
      "query": {
        "range": {
          "order_no": {
            "gte": "vm-0001",
            "lte": "vm-0005"
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多