2017-05-12 3 views
1

ESを使用して大きな名前のリストをインデックスしたいと思っています。 私は各単語の子音と母音を区別し、それぞれの子音の位置とそれが子音か母音かに基づいて検索できるようにします。名前のリストを検索し、各文字のタイプを分類する

だから、のような名前を言う:

CVCC

と、私は、検索を実行すると、JOHNは、結果セットにする必要があります:私はこれを入力したい

JOHN

弾性検索でインデックス名を付けて、母音用のトークンCとVを使ってインデックスを作成して検索することは可能でしょうか?

なんでElasticsearchは各単語の位置ごとに文字種をインデックスする必要がありますが、どのようにこれを行うことができますか?

+0

大文字/小文字も一致させますか? –

答えて

3

カスタムアナライザでは、pattern_replaceの文字フィルタを使用できます。また、私の解決策では、カスタム・アナライザーのサブフィールドを使用しました。おそらく、名前フィールドの他の種類の検索、つまり子音 - 母音は、それらのうちの1つだけを検索したいと考えています。

DELETE test 
PUT test 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my_analyzer": { 
      "tokenizer": "keyword", 
      "char_filter": [ 
      "replace_filter_lowercase_CONS", 
      "replace_filter_uppercase_CONS", 
      "replace_filter_lowercase_VOW", 
      "replace_filter_uppercase_VOW" 
      ] 
     } 
     }, 
     "char_filter": { 
     "replace_filter_lowercase_CONS": { 
      "type": "pattern_replace", 
      "pattern": "[b-df-hj-np-tv-z]{1}", 
      "replacement": "c" 
     }, 
     "replace_filter_uppercase_CONS": { 
      "type": "pattern_replace", 
      "pattern": "[B-DF-HJ-NP-TV-Z]{1}", 
      "replacement": "C" 
     }, 
     "replace_filter_lowercase_VOW": { 
      "type": "pattern_replace", 
      "pattern": "[aeiou]{1}", 
      "replacement": "v" 
     }, 
     "replace_filter_uppercase_VOW": { 
      "type": "pattern_replace", 
      "pattern": "[AEIOU]{1}", 
      "replacement": "V" 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "name": { 
      "type": "text", 
      "fields": { 
      "cons_vow": { 
       "type": "text", 
       "analyzer": "my_analyzer" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

POST /test/test/1 
{"name":"JOHN"} 
POST /test/test/2 
{"name":"Andrew"} 
POST /test/test/3 
{"name":"JOhn DOE"} 

GET /test/_search 
{ 
    "query": { 
    "term": { 
     "name.cons_vow": { 
     "value": "CVCC" 
     } 
    } 
    } 
} 
関連する問題