2

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

2 に答える 2

4

ドキュメントによると、stringフィールドの場合、Elasticsearch は、TermRangeQuery私の知る限り、検索する用語を分析しない を使用します。これは、あなたの範囲VM-0001-VM-0005これらの用語を正確に検索することを意味します。一方、インデックスにはvm-0001(小文字)のようなものがあります。したがって、次のいずれかを使用します。

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

または、インデックスに別のフィールドを追加して、order_no小文字化や nGram-atization なしで as キーワードを保持します。

于 2014-11-26T08:34:35.817 に答える