小文字の用語を検索するクエリがあります。
実際には、小文字のフィルターを使用したindex_analyzerがありましたが、大文字と小文字を区別しない検索を実行できるように、 search_analyzerも追加したかったのです。
"analysis": {
"analyzer" : {
"DefaultAnalyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase"
],
"char_filter": ["punctuation"]
},
"MyAnalyzer": {
"type": "custom",
"tokenizer": "first_letter",
"filter": [
"lowercase"
]
},
だから私はちょうどsearch_analyzerと同じアナライザーをマッピングに追加することを考えました
"index_analyzer": "DefaultAnalyzer",
"search_analyzer": "DefaultAnalyzer",
"dynamic" : false,
"_source": { "enabled": true },
"properties" : {
"name": {
"type": "multi_field",
"fields": {
"name": {
"type": "string",
"store": true
},
"startletter": {
"type": "string",
"index_analyzer": "MyAnalyzer",
"search_analyzer": "MyAnalyzer",
"store": true
}
}
},
そのようにして、手動でElastic Searchにクエリを実行すると
curl -XGET host:9200/my-index/_analyze -d 'Test'
検索用語が正しく小文字になっていることがわかりました
{
"tokens": [
{
"token": "test",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 1
}
]
}
しかし、コードから実行する
- 大文字の検索語を使用すると、ES はヒットを返しません ( search_analyzerが適用されていることを確認した場合でも)
- 小文字の検索語を使用すると、ES は適切な結果ヒット数 (数百) を返します。
ケースとは関係なく同じ結果を得たいのですが。
コードでは、用語フィルターを使用してクエリを作成しているだけです。
{
"filter": {
"term": {
"name.startletter": "O"
}
},
"size": 10000,
"query": {
"match_all": {}
}
}
私が間違っていることは何ですか?なぜ結果が得られないのですか?