Elasticsearch index creation with mapping

elasticsearch

Solution

I believe your issue is that the `analysis` settings need to be nested within a `settings` node in your JSON, not within an `index` node as you have it. Please reference the Elasticsearch Create Index API for details on constructing the JSON.

Therefore, your create index call should look like the the following:

curl -X PUT "http://localhost:9200/$INDEX_NAME/" -d '{
    "settings":{
        "analysis":{
            "analyzer":{
                "analyzer1":{
                    "type":"custom",
                    "tokenizer":"standard",
                    "filter":[ "standard", "lowercase", "stop", "kstem", "ngram" ]
                }
            },
            "filter":{
                "ngram":{
                    "type":"ngram",
                    "min_gram":2,
                    "max_gram":15
                }
            }
        }
    },
    "mappings": {
        "product": {
            "properties": {
                "title": {
                    "type": "string",
                    "search_analyzer" : "analyzer1",
                    "index_analyzer" : "analyzer1"
                }
            }
        }
    }
}';

Problem

I'm struggling with the simple task of index creation, the goal is to create an index with an analyzer and a field mapping. When I create a index with an analyzer i can talk to the analyzer via the analyze api calls, but when I add the mapping information the create index calls fails with "Analyzer [analyzer1] not found for field [$field]]", I created a script to show the problem: ``` #!/bin/bash INDEX_NAME="test1" echo "delete index just to be sure" curl -XDELETE "http://localhost:9200/$INDEX_NAME/"; echo echo "create new index" curl -X PUT "http://localhost:9200/$INDEX_NAME/" -d '{ "index":{ "analysis":{ "analyzer":{ "analyzer1":{ "type":"custom", "tokenizer":"standard", "filter":[ "standard", "lowercase", "stop", "kstem", "ngram" ] } }, "filter":{ "ngram":{ "type":"ngram", "min_gram":2, "max_gram":15 } } } } }'; echo echo "analyze something with our shiny new analyzer" curl -XGET "localhost:9200/$INDEX_NAME/_analyze?analyzer=analyzer1&pretty=true" -d 'abcd' echo "remove the created index" curl -XDELETE "http://localhost:9200/$INDEX_NAME/"; echo echo "create new index again with mapping" curl -X PUT "http://localhost:9200/$INDEX_NAME/" -d '{ "index":{ "analysis":{ "analyzer":{ "analyzer1":{ "type":"custom", "tokenizer":"standard", "filter":[ "standard", "lowercase", "stop", "kstem", "ngram" ] } }, "filter":{ "ngram":{ "type":"ngram", "min_gram":2, "max_gram":15 } } } }, "mappings": { "product": { "properties": { "title": { "type": "string", "search_analyzer" : "analyzer1", "index_analyzer" : "analyzer1" } } } } }'; echo ```

Original source