Elasticsearch always returning "mapping type is missing"
LuceneElasticsearchLucene Problem Overview
I'm following the advice given here in order to find partial words with elasticsearch:
I've created a simple bash script that attempts to run a version of this:
curl -XDELETE 10.160.86.134:9200/products
curl -XPOST 10.160.86.134:9200/products -d '{
"index": {
"number_of_shards": 1,
"analysis": {
"filter": {
"mynGram" : {"type": "nGram", "min_gram": 2, "max_gram": 10}
},
"analyzer": {
"a1" : {
"type":"custom",
"tokenizer": "standard",
"filter": ["lowercase", "mynGram"]
}
}
}
}
}
}'
curl -XPUT 10.160.86.134:9200/products/_mapping -d '{
"product" : {
"index_analyzer" : "a1",
"search_analyzer" : "standard",
"properties" : {
"product_description": {"type":"string"},
"product_name": {"type":"string"}
}
}
}'
Following running this script the first two commands (dumping products, then setting the index) seem to work giving me this:
{"ok":true,"acknowledged":true}
{"ok":true,"acknowledged":true}
Then it errors out following the mapping call giving me this:
{"error":"ActionRequestValidationException[Validation Failed: 1: mapping type is missing;]","status":500}
Can anyone see what I'm doing wrong? Searching google starts autocompleting "mapping not found elasticsearch" so it seems to be a very common error.
Lucene Solutions
Solution 1 - Lucene
Turns out this is happening because the mapping needs to be applied to the type:
I tried applying it to the wrong thing:
curl -XPUT 10.160.86.134:9200/products/_mapping -d '{
It needs to be applied to the type like so:
curl -XPUT 10.160.86.134:9200/products/product/_mapping -d '{
It's sad that a simple google search couldn't answer this. Also the previous post I linked to is very misleading and the answer is wrong, which I'll point out there as well.
Solution 2 - Lucene
Set mapping for the index is possible in Elastic search. I tried this with the latest version of Elastic search 1.7.3 and I was able to set the mapping successfully to the index.
I tried the following,
- Delete the index (DELETE http://localhost:9200/index)
- Put the mapping json under the index (PUT http://localhost:9200/index)
- Get the mapping (GET http://localhost:9200/<index>/_mapping)
Solution 3 - Lucene
I think Travis was right, maybe this error came from some old version of ES, a "type" in some old version of ES is just like a table in the relational database, an "index" is like a database, a "doc" is like a record. Nowadays, the "type" seemed to disappear.
you can see this from here.
I don't know why I can't upload a picture.