1

小文字の用語を検索するクエリがあります。

実際には、小文字のフィルターを使用した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": {}
  }
}

私が間違っていることは何ですか?なぜ結果が得られないのですか?

4

2 に答える 2