python建立elasticsearch索引的探討
以前用elasticsearch都是先create index,然後傳送資料進去。但是最近有個需求,要自動建立索引,所以就只能使用elasticsearch的template功能。
直接上程式碼:
from elasticsearch import Elasticsearch
es = Elasticsearch()
t1 = {
u'aliases': {},
u'mappings': {
u'_default_': {
u'_source': {
u'enabled': False
},
u'properties': {
"title": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
},
}
}
},
u'order': 0,
u'settings': {u'index': {u'number_of_shards': u'1'}},
u'template': u'te*'
}
es.indices.put_template(name='test', body=t1, create=True)
這個時候顯示:
{u'acknowledged': True}
就表示template建立成功了。以後只要是建立以te為開頭的index,都會自動套用上面的模板設定,比如:
body = {'title': u'我到河北省來'}
es.create(index='test_001', doc_type='doc', body=body, id=1)
顯示成功後我們再檢視test_001的mapping:
es.indices.get_mapping(index='test_001')
顯示:
{
u'test_001': {
u'mappings': {
u'_default_': {
u'_source': {
u'enabled': False
},
u'properties': {
u'title': {
u'analyzer': u'ik_max_word',
u'type': u'text'
}
}
},
u'doc': {
u'_source': {
u'enabled': False
},
u'properties': {
u'title': {
u'analyzer': u'ik_max_word',
u'type': u'text'
}
}
}
}
}
}
說明索引的確是按template自動建立了。
更深入的探討,如果我們建立一個新的模板,通配test*的模型的話,對於test_001這樣的索引,又會怎樣呢?
t2 = {
u'aliases': {},
u'mappings': {
u'_default_': {
u'_source': {
u'enabled': False
},
u'properties': {
u"author": {u"type": u'keyword'}
}
}
},
u'order': 1,
u'settings': {u'index': {u'number_of_shards': u'1'}},
u'template': u'test*'
}
es.indices.put_template(name='test_sub', body=t2, create=True)
這個時候再建立一個新的索引test_002, 它的mapping會這樣:
{
u'test_003': {
u'mappings': {
u'_default_': {
u'_source': {
u'enabled': False
},
u'properties': {
u'author': {
u'type': u'keyword'
},
u'title': {
u'analyzer': u'ik_max_word',
u'type': u'text'
}
}
},
u'doc': {
u'_source': {
u'enabled': False
},
u'properties': {
u'author': {
u'type': u'keyword'
},
u'title': {
u'analyzer': u'ik_max_word',
u'type': u'text'
}
}
}
}
}
}
說明test和test_sub的模板同時應用到了test_002這個索引上了。但是這是沒有衝突的情況,如果我們修改test_sub的配置,新增跟test重名的title欄位,但是配置不同的話,又會怎麼樣呢?
t3 = {
u'aliases': {},
u'mappings': {
u'_default_': {
u'_source': {
u'enabled': False
},
u'properties': {
u"title": {u"type": u'keyword'}
}
}
},
u'order': 1,
u'settings': {u'index': {u'number_of_shards': u'1'}},
u'template': u'test*'
}
es.indices.put_template(name='test_sub', body=t3)
然後建立新的索引test_003, 直接報錯:
TransportError(400, u'mapper_parsing_exception', u'Mapping definition for [title] has unsupported parameters: [search_analyzer : ik_max_word] [analyzer : ik_max_word]')
看來似乎es還不支援子模板欄位重名的情況。。。我用es的版本是5.4.3,不知道將來會不會有改動。
相關文章
- elasticsearch(三)----索引建立與刪除Elasticsearch索引
- 關於python中slicing的探討Python
- ElasticSearch分片互動過程(建立索引、刪除索引、查詢索引)Elasticsearch索引
- Elasticsearch6.2.4-利用head外掛建立索引Elasticsearch索引
- Elasticsearch 線上實戰問題及解決方案探討Elasticsearch
- 深入探討MySQL索引的設計原則及最佳化策略MySql索引
- 【Elasticsearch】Elasticsearch 索引模板Elasticsearch索引
- Promise探討Promise
- Elasticsearch Query DSL建立滾動索引(生命週期策略)Elasticsearch索引
- ElasticSearch 索引 VS MySQL 索引Elasticsearch索引MySql
- 剖析 Elasticsearch 的索引原理Elasticsearch索引
- 深入探討 UndefinedUndefined
- 深入探討HBASE
- OPCUA 探討(一)
- elasticsearch索引原理Elasticsearch索引
- 探討.NET Core的未來
- Springboot 加密方案探討Spring Boot加密
- px em rem 探討REM
- 使用Elasticsearch的動態索引和索引優化Elasticsearch索引優化
- elasticsearch配置注入索引Elasticsearch索引
- Elasticsearch 學習索引Elasticsearch索引
- 一起探討JavaScript的物件JavaScript物件
- Web 框架的架構模式探討Web框架架構模式
- XAF中XPO與EFCore的探討
- RabbitMQ中三個TTL的探討MQ
- Netty URL路由方案探討Netty路由
- 深入探討單例模式單例模式
- JavaScript原型鏈汙染探討JavaScript原型
- 關於 performSelector 的一些小探討performSelector
- SEO關於探討URL的知識!
- 「譯」一起探討 JavaScript 的物件JavaScript物件
- 深入探討 Room 2.4.0 的最新進展OOM
- Sql Server深入的探討鎖機制SQLServer
- Elasticsearch(三):索引查詢Elasticsearch索引
- elasticsearch之多索引查詢Elasticsearch索引
- elasticsearch如何設計索引Elasticsearch索引
- Elasticsearch 索引的對映配置詳解Elasticsearch索引
- SQL優化器探討(zt)SQL優化