2017-01-18 9 views
1

部分的に数値フィールドに一致させようとしています。以下のクエリでは、私は419で始まるすべてのドキュメントを一致させるために(ロングとして定義される)のIDをたいと思います(その4191がすべき419534ではなく123419として、一致している必要があります)番号フィールドの弾性検索部分一致

{ 
    "size": 20, 
    "from": 0, 
    "sort": [{ 
     "customerName": "asc" 
    }], 
    "query": { 
     "bool": { 
      "must": [{ 
       "bool": { 
        "should": [{ 
         "term": { 
          "id": 419 
         } 
        }] 
       } 
      }] 
     } 
    } 
} 

誰もが持って私のクエリで使用するきちんとしたソリューション?

"mappings": { 
    "default": { 
     "properties": { 
      "id": { 
       "type": "integer", 
       "fields": { 
        "prefixed": { 
         "type": "string", 
         "index": "not_analyzed" 
        } 
       } 
      }, 
      ... 
     } 
    } 
} 

をし、そのフィールドに対してprefix queryを使用します:

+0

この回答は役に立ちました:http://stackoverflow.com/questions/36199531/how-to-f uzzy-match-email-or-elasticsearch/36200119#36200119しかし、代わりにあなたの 'id'を文字列として保存する必要があるかもしれません。 – Val

+0

文字列に変換するのは簡単ですが、私は誰かがより良い/異なる解決法を知っていることを期待していました。部分の数字を分割すると(たとえば1 12 123)、数字を探す複雑な方法のように思えます。私はそれを文字列に変換し、何か解決策があるかどうかを見るためにこれを開いたままにしておきます。もう一度お手伝いをしてくれて、あなたは邪悪です。 –

+0

青から、代わりに 'query_string'を使い、' 419 * 'をクエリとして使うことができますか? – Val

答えて

1

EGDEのnグラムを避けるために、あなたはあなたのIDマッピングではない分析されたテキストのサブフィールドを宣言することができ、文字列フィールドに

"query": { 
    "prefix" : { 
     "id.prefixed" : { "value" : 419 } 
    } 
} 
+0

これは本当に私がやったことであり、現時点でこれを達成する唯一の方法であるようです。私は答えを受け入れるでしょう。なぜならそれはValが提供したソリューションと同じで、私は当初考えていたからです。より良い答えが出たら、私はその答えを受け入れます。 –

-1

ワイルドカードクエリを使用することができます:

{ 
"query" : { 
    "wildcard" : { "id" : "*419*" } 
} 
} 
関連する問題