elasticsearch的mapping映射


Mapping簡述

Elasticsearch是一個schema-less的系統,但並不代表no shema,而是會盡量根據JSON源數據的基礎類型猜測你想要的字段類型映射。
Elasticsearch中Mapping類似於靜態語言中的數據類型,但是同語言的數據類型相比,映射還有一些其他的含義。
Elasticsearch會根據JSON源數據的基礎類型猜測你想要的字段映射。將輸入的數據轉變成可搜索的索引項。Mapping就是我們自己定義的字段的數據類型,同時告訴Elasticsearch如何索引數據以及是否可以被搜索。

映射的增刪改查

Elasticsearch可以根據數據中的新字段來創建新的映射,當然,在正式數據寫入之前我們可以自己定義Mapping,
等數據寫入時,會按照定義的Mapping進行映射。如果后續數據有其他字段時,Elasticsearch會自動進行處理。

curl -XPUT 'http://localhost:9200/logstash-2016.01.01/_mapping' -d '
{
	"mappings" : {
		"syslog" : {
			"properties" : {
				"@timestamp" : {
					"type" : "date"
				},
				"message" : {
					"type" : "string"
				},
				"pid" : {
					"type" : "long"
				}
			}
		}
	}
}
'



在這里需要注意一下,我們已經存在的索引是不可以更改它的映射的,對於存在的索引,只有新字段出現時,Elasticsearch才會自動進行處理。如果確實需要修改映射,那么就使用reindex,采用重新導入數據的方式完成。

ReIndex

Elasticsearch並不提供針對索引的rename,mapping、alter等操作。如果需要更改某個字段的mapping映射,只有一些其他工具。
用Logstash重建索引:
在最新版的logstash中,對logstash-input-elasticsearch插件做了一定的修改,使得通過Logstash完成重建索引稱為可能。

Delete

雖然寫入數據時Elasticsearch會自動的添加映射進行處理,但是刪除數據並不會刪除數據的映射
#curl -XDELETE 'http://localhost:9200/logstash-2016.01.01/syslog' 刪除了syslog下面的全部數據,但是syslog的映射還在
刪除映射的命令:
#curl -XDELETE 'http://localhost:9200/logstash-2016.01.01/_mapping'
刪除索引的話映射也會刪除
#curl -XDELETE 'http://localhost:9200/logstash-2016.01.01'

查看:

學習索引的話最直接的方式就是查看logstash寫入數據到Elasticsearch的時候會根據自帶的template生成一個很有學習意義的映射

Elasticsearch數據類型

Elasticsearch自帶的數據類型數Lucene索引的依據,也是我們做手動映射調整到依據。
映射中主要就是針對字段設置類型以及類型相關參數。
JSON基礎類型如下:
字符串:string
數字:byte、short、integer、long、float、double、
時間:date
布爾值: true、false
數組: array
對象: object
Elasticsearch獨有的類型:
多重: multi
經緯度: geo_point
網絡地址: ip
堆疊對象: nested object
二進制: binary
附件: attachment

注意點:
Elasticsearch 映射雖然有idnex和type兩層關系,但是實際索引時是以index為基礎的。如果同一個index下不同type的字段出現mapping不一致的 情況,雖然數據依然可以成功寫入並生成並生成各自的mapping,但實際上fielddata中的索引結果卻依然是以index內第一個mapping 類型來生成的。

自定義字段映射

Elasticsearch的Mapping提供了對Elasticsearch中索引字段名及其數據類型的定義,還可以對某些字段添加特殊屬性:該字段是否分詞,是否存儲,使用什么樣的分詞器等。

精確索引:

字段都有幾個基本的映射選項,類型(type)和索引方式(index)。以字符串類型為例,index有三個選項:
analyzed:默認選項,以標准的全文索引方式,分析字符串,完成索引。
not_analyzed:精確索引,不對字符串做分析,直接索引字段數據的精確內容。
no:不索引該字段。

對於日志文件來說,很多字段都是不需要再Elasticsearch里做分析這步的,所以,我們可以這樣設置:

"myfieldname" : {
	"type" : "string",
	"index" : "not_analyzed"
}



時間格式:

@timestamp這個時間格式在Nginx中叫$time_iso8601,在 Rsyslog中叫date-rfc3339,在Elasticsearch中叫dateOptionalTime.但事實 上,Elasticsearch完全可以接受其他時間格式作為時間字段的內容。對於Elasticsearch來說,時間字段內容實際上就是轉換成 long類型作為內部存儲的。所以,接受段的時間格式可以任意設置:

@timestamp: {
	"type" : "date",
	"index" : "not_analyzed",
	"doc_values" : true,
	"format" : "dd/MM/YYYY:HH:mm:ss Z"
}

 

多種索引:

多重索引是Logstash用戶習慣的的一個映射,因為這是Logstash默認開啟的配置:

"title" : {
	"type" : "string",
	"fields" : {
		"raw" : {
			"type" : "string",
			"index" : "not_analyzed"		
		}
	}
}

其作用時,在title字段數據寫入的時候,Elasticsearch會自動生成兩個字段,分別是title和title.raw。這 樣,有可能同時需要分詞和部分次結果的環境,就可以很靈活的使用不同的索引字段了。比如,查看標題中最常用的單詞,應該是使用title字段,查看閱讀數 最多的文章標題,應該是使用title.raw字段。

多值字段:

空字段:

數組可以使空的。這等於有零個值。事實上,Lucene沒法存放null值,所以一個null值的字段唄認為是孔子段。
下面這四個字段將被識別為空字段而不被索引:
"empty_string" : "",
"null_value" : null,
"empty_array" : [],
"array_with_null_value" : [ null ]


免責聲明!

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



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