2017-04-14 4 views
0

カスタムアナライザを使用するいくつかのフィールドを持つElasticSearchインデックスがあります。アナライザの1つに、質問を作成する際に大文字と小文字の区別をなくすためのトークンフィルタ(uppercase)が含まれています(たとえば、「ボール」に「ボール」または「ボール」も一致させたい)。「大文字」のトークンフィルタを使用してドキュメントを照会する適切な方法

正規表現パターンは、大文字である索引の用語と照合されます。だから、 "app *"は私たちのインデックスに "Apple"とマッチしません。

ESの外でいくつかのハックなことをすることなくこれを動作させる方法はありますか?

代わりに "query_string"を使って遊んで、別の結果があるかどうかを確認することができます。

答えて

0

これは、使用しているクエリの種類によって異なります。その型が入力文字列を分析するためにフィールド自体のアナライザを使用する場合、それはうまくいくはずです。

regexpクエリを使用している場合、このクエリは入力文字列を解析しないため、app.*をそのまま渡しても、ユーザーは検索対象となります。

しかし、あなたは適切query_stringクエリを使用する場合は、1つは動作するはずその:

{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my": { 
      "type":  "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "uppercase" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "some_field": { 
      "type": "text", 
      "analyzer": "my" 
     } 
     } 
    } 
    } 
} 

とクエリ自体:

{ 
    "query": { 
    "query_string": { 
     "query": "some_field:app*" 
    } 
    } 
} 

が、私はそれが何を考えて、それはやっていることを確認すると、私はいつも_validate apiを使用します:

GET /_validate/query?explain&index=test 
{ 
    "query": { 
    "query_string": { 
     "query": "some_field:app*" 
    } 
    } 
} 

これは、入力文字列に対してESが何をしているかを表示します:

"explanations": [ 
    { 
     "index": "test", 
     "valid": true, 
     "explanation": "some_field:APP*" 
    } 
    ] 
関連する問題