2016-10-20 14 views
2

私は初心者が含まれており、次のようなシナリオに問題がある場合は、一致フレーズ:ElasticSearch:帯状疱疹 - フィールドは、弾性検索と正確なシングルトークン

  1. のが唯一のフィールド「テキスト」 が含まれている私は2つの文書を持って考えてみましょう
    1. "テキスト": "TOKEN1 token4"
    2. "テキスト": "token2 token3"
    3. "テキスト": "token4 token5"
  2. とクエリ・テキスト「TOKEN1 token2 token3 token4 token5」私は、クエリから次のトークンを作成します帯状疱疹フィルタに似た何かを必要とする文書のみ2及び3

を見つけたい以下による:

を[ "TOKEN1 token2"、 "token2 token3"、 "token3 token4"、 "token4 token5"]

そして "token4 token5は" 文書

にマッチしますトークン "token2のtoken3" ように、これらのトークンによって完全一致を行います

ありがとうございます!

答えて

2

これは(それは単一のトークンの発生を防止します)偽をshingle filterを使用してoutput_unigramsを行うことによって行うことができます。このようなインデックスを作成してください。

PUT shingle_index 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "shingle_analyzer": { 
      "tokenizer": "standard", 
      "filter": [ 
      "shingle_filter", 
      "lowercase" 
      ] 
     } 
     }, 
     "filter": { 
     "shingle_filter":{ 
      "type" : "shingle", 
      "max_shingle_size" : 2, 
      "min_shingle_size" : 2, 
      "output_unigrams" : false, 
      "output_unigrams_if_no_shingles" : true 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "mytype":{ 
     "properties": { 
     "text" : { 
      "type": "string", 
      "analyzer": "shingle_analyzer" 
     } 
     } 
    } 
    } 
} 

POST /shingle_index/mytype/_bulk 
{"index":{"_id":5}} 
{"text":"token1 token4"} 
{"index":{"_id":3}} 
{"text":"token2 token3"} 
{"index":{"_id":2}} 
{"text":"token4 token5"} 

次に、単純一致のクエリを使用すると、目的の結果が得られます。

GET shingle_index/_search 
{ 
    "query": { 
    "match": { 
     "text": "token1 token2 token3 token4" 
    } 
    } 
}