1

Elasticsearch のドキュメントを読むと、アナライザーに「default_search」という名前を付けると、別のアナライザーが指定されていない限り、そのアナライザーがすべての検索に使用されることが予想されます。ただし、次のようにインデックスを定義すると:

curl -XPUT 'http://localhost:9200/test/' -d '{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_ngram_analyzer": {
                    "tokenizer": "my_ngram_tokenizer",
                    "filter": [
                        "lowercase"
                    ],
                    "type" : "custom"
                },
                "default_search": {
                    "tokenizer" : "keyword",
                    "filter" : [
                        "lowercase"
                    ]
                }
            },
            "tokenizer": {
                "my_ngram_tokenizer": {
                    "type": "nGram",
                    "min_gram": "3",
                    "max_gram": "100",
                    "token_chars": []
                }
            }
        }
    },
    "mappings": {
        "TestDocument": {
            "dynamic_templates": [
                {
                    "metadata_template": {
                        "match_mapping_type": "string",
                        "path_match": "*",
                        "mapping": {
                            "type": "multi_field",
                            "fields": {
                                "ngram": {
                                    "type": "{dynamic_type}",
                                    "index": "analyzed",
                                    "analyzer": "my_ngram_analyzer"
                                },
                                "{name}": {
                                    "type": "{dynamic_type}",
                                    "index": "analyzed",
                                    "analyzer": "standard"
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}'

そして、'TestDocument' を追加します。

curl -XPUT 'http://localhost:9200/test/TestDocument/1' -d '{
    "name" : "TestDocument.pdf" }'

私のクエリはまだデフォルトのアナライザーを介して実行されています。このクエリがヒットするので、わかります。

curl -XGET 'localhost:9200/test/TestDocument/_search?pretty=true' -d '{
    "query": {
         "match": {
                    "name.ngram": {
                        "query": "abc.pdf"
                    }
                }
    }
}'

しかし、正しいアナライザーを指定した場合はそうではありません (「キーワード」トークナイザーを使用)

curl -XGET 'localhost:9200/test/TestDocument/_search?pretty=true' -d '{
    "query": {
         "match": {
                    "name.ngram": {
                        "query": "abc.pdf",
                        "analyzer" : "default_search"
                    }
                }
    }
}'

クエリで特に明記されていない限り、検索に「default_search」を使用するには何が欠けていますか? ここで予想される動作を誤解しているだけですか?

4

1 に答える 1

3

動的テンプレートでは、「アナライザー」を使用して検索およびインデックス アナライザーを設定しています。デフォルトは最後の手段としてのみ使用されます。

"index_analyzer":"analyzer_name" //sets the index analyzer
"analyzer":"analyzer_name" // sets both search and index
"search_analyzer":"...." // sets the search analyzer.
于 2013-10-09T03:23:57.470 に答える