setting
通過setting可以更改es配置可以用來修改副本數和分片數。
1:查看,通過curl或瀏覽器可以看到副本分片信息
curl -XGET http://192.168.79.131:9200/shb01/_settings?pretty
http://192.168.79.131:9200/shb01/_settings?prett
2:修改
不存在索引shb03時可以指定副本和分片,如果shb03已經存在則只能修改副本
curl -XPUT http://192.168.79.131:9200/shb03-d'{"settings":{"number_of_shards":4,"number_of_replicas":2}}'

shb03已經存在不能修改分片
curl -XPUThttp://192.168.79.131:9200/shb03/_settings -d '{"index":{"number_of_replicas":2}}'
mapping
我們在es中添加索引數據時不需要指定數據類型,es中有自動影射機制,字符串映射為string,數字映射為long。通過mappings可以指定數據類型是否存儲等屬性。
1:查看mapping信息
curl -XGEThttp://192.168.79.131:9200/shb01/_mappings?pretty
http://192.168.79.131:9200/shb01/_mappings?pretty
2:修改,通過mappings還可以指定分詞器
操作不存在的索引
curl -XPUT http://192.168.79.131:9200/shb02-d'{"mappings":{"emp":{"properties":{"name":{"type":"string","indexAnalyzer":"ik","searchAnalyzer": "ik"}}}}}'
操作已存在的索引
curl -XPOSThttp://192.168.79.131:9200/crxy/shb02/_mapping-d'{"properties":{"name":{"type":"string","indexAnalyzer":"ik","searchAnalyzer": "ik"}}}'
java操作settings和mappings
- /**
- * settings,mappings
- * @throws IOException
- *
- * org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
- * org.elasticsearch.common.xcontent.XContentBuilder;
- * org.elasticsearch.common.xcontent.XContentFactory;
- */
- @Test
- public void testSettingsMappings() throws IOException
- {
- //1:settings
- HashMap<String, Object> settings_map = new HashMap<String, Object>(2);
- settings_map.put("number_of_shards", 3);
- settings_map.put("number_of_replicas", 1);
- //2:mappings
- XContentBuilder builder = XContentFactory.jsonBuilder()
- .startObject()
- .field("dynamic", "stu")
- .startObject("properties")
- .startObject("id")
- .field("type", "integer")
- .field("store", "yes")
- .endObject()
- .startObject("name")
- .field("type", "string")
- .field("store", "yes")
- .field("index", "analyzed")
- .field("analyzer", "id")
- .endObject()
- .endObject()
- .endObject();
- CreateIndexRequestBuilder prepareCreate = transportClient.admin().indices().prepareCreate("shb01");
- prepareCreate.setSettings(settings_map).addMapping("stu", builder).execute().actionGet();
- }
一般在工作中關閉自動映射防止垃圾數據進入索引庫,提前定義好索引庫的字段信息當有非法的數據進來時會報錯。如果不知道字段信息則開啟。
分片查詢
Es會將數據均衡的存儲在分片中,我們可以指定es去具體的分片或節點鍾查詢從而進一步的實現es極速查詢。
1:randomizeacross shards
隨機選擇分片查詢數據,es的默認方式
2:_local
優先在本地節點上的分片查詢數據然后再去其他節點上的分片查詢,本地節點沒有IO問題但有可能造成負載不均問題。數據量是完整的。
3:_primary
只在主分片中查詢不去副本查,一般數據完整。
4:_primary_first
優先在主分片中查,如果主分片掛了則去副本查,一般數據完整。
5:_only_node
只在指定id的節點中的分片中查詢,數據可能不完整。
6:_prefer_node
優先在指定你給節點中查詢,一般數據完整。
7:_shards
在指定分片中查詢,數據可能不完整。
8:_only_nodes
可以自定義去指定的多個節點查詢,es不提供此方式需要改源碼。
注:es的數據存放在/usr/local/elasticsearch-1.4.4/data,如果要升級es可先備份此目錄
- /**
- * 指定分片 查詢
- */
- @Test
- public void testPreference()
- {
- SearchResponse searchResponse = transportClient.prepareSearch(index)
- .setTypes("add")
- //.setPreference("_local")
- //.setPreference("_primary")
- //.setPreference("_primary_first")
- //.setPreference("_only_node:ZYYWXGZCSkSL7QD0bDVxYA")
- //.setPreference("_prefer_node:ZYYWXGZCSkSL7QD0bDVxYA")
- .setPreference("_shards:0,1,2")
- .setQuery(QueryBuilders.matchAllQuery()).setExplain(true).get();
- SearchHits hits = searchResponse.getHits();
- System.out.println(hits.getTotalHits());
- SearchHit[] hits2 = hits.getHits();
- for(SearchHit h : hits2)
- {
- System.out.println(h.getSourceAsString());
- }
- }