2017-01-27 12 views
0

私のインデックスのフィールドを照会するにはいくつかの助けが必要です。弾性検索クエリ

"Show me the code GB 40"

:私は、クエリを使用している場合

GB10
GB40
GB45
UK09
UK40

:このフィールドには、次のようなデータを持っていますノートeとGBとの間のスペース

私は、結果としてGB40の結果を返すようにJSONを希望します。誰でもこのことをやっていくためにどのようにすればいいのか、何か変更が必要なのかを教えてください。私はフィールドをまだ分析するように設定していません。

+1

なぜそうしようとしているのか分かりません。 – Adi

+0

あなたのユースケースを説明できますか? –

+0

あなたのクエリとマッピングを表示してください。助けが簡単になります – user3775217

答えて

0

あなたがそのようなパターンの単語を持っているなら、split on letter-number transitions: "SD500" → "SD", "500"を利用して、word_delimiterトークンフィルタを弾力性のあるものにすることができます。

このフィルタを使用してレターワードのトランジションにワードを分割すると、反転インデックスにワードとレターワードの両方を別々に格納できます。永遠にこれはインデックスに正確な価値のコピーを保持します。

ユーザーは「EC 450」を入力した場合、あなたは次のようなクエリを構築することができ、あなたのユースケース今

PUT testindex_48 
{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 

       "word_delimiter_analyzer": { 
        "tokenizer": "whitespace", 
        "filter": [ 
         "lowercase", 
         "word_delimiter" 
        ], 
        "ignore_case": true, 
        "preserve_original": true 
       } 
      }, 
      "filter":{ 

      "word_delimiter":{ 
       "type":"word_delimiter", 
       "generate_word_parts":true, 
       "preserve_original": true 
      } 
     } 
     } 
    }, 
    "mappings": { 
     "table1": { 
      "properties": { 
       "title": { 
        "type": "string", 
        "analyzer": "word_delimiter_analyzer" 
       } 
      } 
     } 
    } 
} 

POST testindex_48/table1 
{ 
    "title" : "EC450" 
} 

POST testindex_48/table1/_search 
{ 
    "query": {"bool": {"must": [ 
    {"term": { 
     "title": { 
     "value": "450" 
     } 
    }} 
    ]}} 
} 

POST testindex_48/table1/_search 
{ 
    "query": {"bool": {"must": [ 
    {"term": { 
     "title": { 
     "value": "ec" 
     } 
    }} 
    ]}} 
} 


POST testindex_48/table1/_search 
{ 
    "query": {"bool": {"must": [ 
    {"term": { 
     "title": { 
     "value": "ec450" 
     } 
    }} 
    ]}} 
} 

の下にマッピングし、クエリを参照してください。

+0

私の答えを参照してくださいこれは素晴らしい音、私はそれをテストしますありがとう。もっと混乱させるもう1つのことは、mySQL dbから来る同じ分野では、マッピングで分割する方法を識別する簡単な方法がない、単なるアルファベットなどのデータがあるかもしれません。ユーザーがスペースを使って 'aaa bbb'を検索する場合、結果データを取得するために何らかのファジーマッチングを使用するケースがありますか?それとももっと良い方法がありますか? – Chu

+0

次に、n-gramトークナイザを使用して文字列全体をトークン化して、ファジーマッチングの代わりに単純なものを維持します。//www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer .html。おかげで – user3775217

+0

素晴らしいアドバイス!助けてくれてありがとう、私は今すべてをテストしました。 – Chu