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索引
- 探討工廠模式的物件建立模式物件
- elasticsearch(三)----索引建立與刪除Elasticsearch索引
- Elasticsearch5.x建立索引(Java)ElasticsearchH5索引Java
- 關於MSSQL中計算列上建索引的探討SQL索引
- Elasticsearch 線上實戰問題及解決方案探討Elasticsearch
- ElasticSearch分片互動過程(建立索引、刪除索引、查詢索引)Elasticsearch索引
- 關於python中slicing的探討Python
- python當中__metaclass__探討Python
- 索引壓縮在實際生產中應用的探討索引
- 【Elasticsearch】Elasticsearch 索引模板Elasticsearch索引
- Elasticsearch6.2.4-利用head外掛建立索引Elasticsearch索引
- 深入探討MySQL索引的設計原則及最佳化策略MySql索引
- Promise探討Promise
- Elasticsearch索引。Elasticsearch索引
- Elasticsearch Query DSL建立滾動索引(生命週期策略)Elasticsearch索引
- ElasticSearch 索引 VS MySQL 索引Elasticsearch索引MySql
- 深入探討 UndefinedUndefined
- IsPostBack深入探討
- 剖析 Elasticsearch 的索引原理Elasticsearch索引
- elasticsearch索引原理Elasticsearch索引
- 深入探討、理解Java的CLASSPATHJava
- px em rem 探討REM
- with as探討時小插曲
- Oracle Stream 深入探討Oracle
- JdonFramework程式碼探討Framework
- Open Session In View 探討SessionView
- Elasticsearch 學習索引Elasticsearch索引
- elasticsearch配置注入索引Elasticsearch索引
- 使用Elasticsearch的動態索引和索引優化Elasticsearch索引優化
- 一起探討JavaScript的物件JavaScript物件
- RabbitMQ中三個TTL的探討MQ
- Web 框架的架構模式探討Web框架架構模式
- 關於mongo原子操作的探討Go
- 關於identity列的探討IDE
- BI工具選擇的探討有感
- Java執行緒的深入探討Java執行緒
- 深入探討單例模式單例模式