使用elasticsearch进行范围查询

时间:2014-11-26 08:12:27

标签: elasticsearch range-query

我正在尝试使用范围查询与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
      }
    }
  }
}

2 个答案:

答案 0 :(得分:2)

根据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。

答案 1 :(得分:2)

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