2

我正在尝试将范围查询与弹性搜索一起使用

{
    "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
      }
    }
  }
}
4

2 回答 2

4

根据文档,在string字段的情况下,Elasticsearch 使用TermRangeQuery据我所知不分析要搜索的术语。这意味着您的范围VM-0001-VM-0005搜索确切的这些术语。而您的索引中有类似vm-0001(小写)的东西。所以,要么使用:

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

或在索引中添加另一个字段,在其中保留order_noas 关键字而不进行任何小写或 nGram-atization。

于 2014-11-26T08:34:35.817 回答
3
{
  "query": {
    "range": {
      "order_no": {
        "gte": "vm-0001",
        "lte": "vm-0005"
      }
    }
  }
}
于 2014-12-01T07:24:28.967 回答