1. 程式人生 > >Elasticsearch筆記七之setting,mapping,分片查詢方式

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

setting

通過setting可以更改es配置可以用來修改副本數和分片數。

1:檢視,通過curl或瀏覽器可以看到副本分片資訊


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



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());
		}
	}