Elasticsearch筆記七之setting,mapping,分片查詢方式


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

[java]  view plain  copy
  1. /** 
  2.      * settings,mappings 
  3.      * @throws IOException  
  4.      *  
  5.      * org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; 
  6.      * org.elasticsearch.common.xcontent.XContentBuilder; 
  7.      * org.elasticsearch.common.xcontent.XContentFactory; 
  8.      */  
  9.     @Test  
  10.     public void testSettingsMappings() throws IOException  
  11.     {  
  12.         //1:settings  
  13.         HashMap<String, Object> settings_map = new HashMap<String, Object>(2);  
  14.         settings_map.put("number_of_shards"3);  
  15.         settings_map.put("number_of_replicas"1);  
  16.           
  17.         //2:mappings  
  18.         XContentBuilder builder = XContentFactory.jsonBuilder()  
  19.                 .startObject()  
  20.                     .field("dynamic""stu")  
  21.                     .startObject("properties")  
  22.                         .startObject("id")  
  23.                             .field("type""integer")  
  24.                             .field("store""yes")  
  25.                         .endObject()  
  26.                         .startObject("name")  
  27.                             .field("type""string")  
  28.                             .field("store""yes")  
  29.                             .field("index""analyzed")  
  30.                             .field("analyzer""id")  
  31.                         .endObject()  
  32.                     .endObject()  
  33.                 .endObject();  
  34.           
  35.         CreateIndexRequestBuilder prepareCreate = transportClient.admin().indices().prepareCreate("shb01");  
  36.         prepareCreate.setSettings(settings_map).addMapping("stu", builder).execute().actionGet();  
  37.     }         

一般在工作中關閉自動映射防止垃圾數據進入索引庫,提前定義好索引庫的字段信息當有非法的數據進來時會報錯。如果不知道字段信息則開啟。


分片查詢

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可先備份此目錄

[java]  view plain  copy
  1. /** 
  2.      * 指定分片 查詢 
  3.      */  
  4.     @Test  
  5.     public void testPreference()  
  6.     {  
  7.         SearchResponse searchResponse = transportClient.prepareSearch(index)  
  8.                 .setTypes("add")  
  9.                 //.setPreference("_local")  
  10.                 //.setPreference("_primary")  
  11.                 //.setPreference("_primary_first")  
  12.                 //.setPreference("_only_node:ZYYWXGZCSkSL7QD0bDVxYA")  
  13.                 //.setPreference("_prefer_node:ZYYWXGZCSkSL7QD0bDVxYA")  
  14.                 .setPreference("_shards:0,1,2")  
  15.                 .setQuery(QueryBuilders.matchAllQuery()).setExplain(true).get();  
  16.           
  17.         SearchHits hits = searchResponse.getHits();  
  18.         System.out.println(hits.getTotalHits());  
  19.         SearchHit[] hits2 = hits.getHits();  
  20.         for(SearchHit h : hits2)  
  21.         {  
  22.             System.out.println(h.getSourceAsString());  
  23.         }  
  24.     }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM