Beats,Logstash負責數據收集與處理。至關於ETL(Extract Transform Load)。
Elasticsearch負責數據存儲、查詢、分析。
Kibana負責數據探索與可視化分析。css
一、Elasticsearch的常見術語。注意:Elasticsearch6.x版本之後概念發生了變化。
html
二、索引Index:由具備相同字段的文檔列表組成。索引Index是文檔的集合。至關於數據庫中的數據表。python
Elasticsearch 6.x版本之後,一個索引Index下面最多隻能建一個Type或者將來沒有Type了。索引中存儲具備相同結構的文檔(Document)。至關於數據表,數據表中有schema的概念,數據表有本身的表結構的定義。而Index的mapping至關於數據表的schema的概念,Index也須要定義字段名稱和類型的。正則表達式
每一個索引都有本身的mapping定義,用於定義字段名和類型。一個集羣能夠有多個索引。數據庫
三、文檔Document:用戶存儲在es中的數據文檔。es中存儲的最小單元。至關於數據庫中的一行數據。每一個文檔都有惟一的id標識,能夠自行指定或者es自動生成。json
Json Object,由字段Field組成,常見數據類型以下:
字符串:text(分詞)、keyword(不分詞)。
數值型:long、integer、short、byte、double、float、half_float、scaled_float。
布爾型:boolean。
日期:data。
二進制:binary。
範圍類型:interger_range、float_range、long_range、double_range、date_range。api
四、Document MetaData。元數據,用於標註文檔的相關信息。數組
_index:文檔所在的索引名稱。
_type:文檔所在的類型名稱。
_id:文檔惟一的id。
_uid:組合id,由_type和_id組成(6.x_type再也不起做用,同_id同樣)。
_source:文檔的原始Json數據,能夠從這裏獲取每一個字段的內容。
_all:整合全部字段內容到該字段,默認禁用。網絡
五、節點Node:一個Elasticsearch的運行實例,是集羣的構成單元。app
六、集羣Cluster:由一個或者多個節點組成,對外提供服務。
七、Elasticsseach提供的Rest api。
Elasticsseach集羣對外提供的RESTFul API,REST是REpresentational State Transfer的縮寫。
URI指定資源,如Index、Document等等。
Http Method,指明資源操做類型,如GET、POST、PUT、DELETE等等。
Rest API經常使用的兩種交互方式:Curl命令行、Kibana DecTools。
ElasticSearch有專門的Index API,用於建立(PUT)、查看(GET)、更新(Post)、刪除(Delete)索引配置等等。
八、Elasticsseach提供的Rest api使用。
建立文檔,指定id建立文檔的api。建立文檔的時候,若是索引不存在,es會自動建立對應的index和type。
PUT /index/type/id{ "username":"zhangsan", "age":24 }
查詢文檔,指定要查詢的文檔id。_source存儲了文檔的完整原始數據。
get /index/type/id
查詢文檔,搜索全部文檔,用到_search,查詢語句json格式,放到http body中發送到es,以下所示:
get /index/type/_search 返回_id爲1的文檔。 get /index/type/_search{ "query":{ "term":{ "_id":"1" } } }
response結果,參數解釋以下所示:
1 response結果,參數解釋以下所示: 2 { 3 "took" : 2, # took是查詢耗時,單位是ms。 4 "timed_out" : false, 5 "_shards" : { 6 "total" : 5, 7 "successful" : 5, 8 "skipped" : 0, 9 "failed" : 0 10 }, 11 "hits" : { # hits是命中的結果集。 12 "total" : 1, # total是符合條件的總文檔數。 13 "max_score" : 0.2876821, 14 "hits" : [ # hits是返回的文檔詳情數據數組,默認前10個文檔。 15 { 16 "_index" : "test_index", # _index是索引名稱。 17 "_type" : "doc", 18 "_id" : "1", # _id是文檔的id。 19 "_score" : 0.2876821, # _score是文檔的得分。 20 "_source" : { # _source是文檔的詳情。 21 "username" : "wangwu", 22 "age" : 24 23 } 24 } 25 ] 26 } 27 }
批量建立文檔API,es容許一次建立多個文檔,從而減小網絡傳輸開銷,提高寫入速率。endponit爲_bulk,即url最後是_bulk,http method是post請求,以下所示:
action_type包含,index(若是存在則覆蓋)、update、create(若是存在則報錯)、delete這幾種類型。
es容許一次查詢多個文檔,endpoint爲_mget,以下所示:
九、Elasticsearch的倒排索引與分詞。舉例,書的目錄頁與索引頁,目錄頁對應正排索引,索引頁對應倒排索引。es存儲的是一個json格式的文檔,其中包含多個字段,每一個字段會有本身的倒排索引。
a、正排索引就是文檔Id到文檔內容,單詞的關聯關係。倒排索引,就是單詞到文檔Id的關聯關係。
b、倒排索引是搜索引擎的核心,主要包含兩個部分。單詞詞典(Term Dictionary),倒排列表(Posting List),Posting是倒排索引項。
c、單詞詞典(Term Dictionary)是倒排索引的重要組成。
一是記錄全部文檔的單詞,通常都比較大,
二是記錄單詞到倒排列表的關聯信息,記錄了單詞關聯了那些文檔,記錄一下關聯信息,就能夠找到關聯的文檔的id,經過關聯id找到真正的文檔信息。
d、倒排索引中的倒排列表。
倒排列表(Posting List)記錄了單詞對應的文檔集合,由倒排索引項(Psoting)組成。
倒排索引項(Posting)主要包含以下信息:
文檔Id,用於獲取原始信息。
單詞頻率(TF,Term Frequency),記錄該單詞在該文檔中的出現次數,用於後續相關性算分。
位置(Position),記錄單詞在文檔中的分詞位置(多個),用於作此語搜索(Phrase Query)。
偏移(Offset),記錄單詞在文檔的開始和結束位置,用於作高亮顯示。
十、分詞,是指將文本轉換成一系列單詞(term or token)的過程,也能夠叫作文本分詞,在es裏面稱爲Analysis,以下所示:
分詞器,負責進行分詞,分詞器是es中專門處理分詞的組件,英文名稱爲Analyzer。分詞器的調用順序,Character Filters ->Tokenizer ->Token Filter,它的組成以下所示:
Character Filters,針對原始文本進行處理,好比去除html特殊標記符。
Tokenizer,將原始文本按照必定規則切分爲單詞。
Token Filter,針對Tokenizer處理的單詞就行再加工,好比轉小寫,刪除或者新增等等處理。
十一、Analyzer api,es提供了一個測試分詞的api接口,方便驗證分詞效果,endpoint是_analyze。
a、能夠直接指定analyzer進行測試。
b、能夠直接指定索引中的字段進行測試。
c、能夠自定義分詞器進行測試。
十二、Elasticsearch自帶分詞器,包含Standard、Simple、Whitespace、Stop、Keyword、Pattern、Language,以下所示:
a、Standard Analyzer,默認分詞器,特性爲:a、按照切分,支持多語言,b、小寫處理。
包含Tokenizer(Standard)和Token Filters(Standard -> Lower case -> Stop[disabled by default])。
b、Simple Analyzer,特性爲:a、按照非字母進行切分,b、小寫處理。
包含Tokenizer(Lower Case)。
c、Whitespace Analyzer,特性爲:a、按照空格進行切分。
包含Tokenizer(Whitespace)。
d、Stop Analyzer,Stop word指語氣助詞等修飾性的此語,好比the、an、的、這等等。特性爲,a、相比Simple Analyzer多了Stop word處理。
包含Tokenizer(Lower Case),Token Filters(Stop)。
e、Keyword Analyzer,特性爲,a、不分詞,直接將輸入做爲一個單詞輸出。
包含Tokenizer(Keyword)。
f、 Pattern Analyzer,特性爲,a、經過正則表達式自定義分隔符。b、默認是\W+,即非字詞的符號做爲分隔符。
包含Tokenizer(Pattern),Token Filters(Lower case -> Stop[disabled by default])。
g、Language Analyzer,提供了30+常見語言的分詞器。
arabic、armenian、basque、bengali、brazilian、bulgarian、catalan、cjk、czech、danish、dutch、english。
1三、中文分詞,指的是將一個漢字序列切分紅一個一個單獨的詞。在英文中,單詞之間是以空格做爲天然分界符,漢語中詞沒有一個形式上的分界符。
經常使用中文分詞系統。
IK中文分詞器。
a、實現中英文單詞的切分,支持ik_smart,ik_maxword等模式。
b、能夠自定義詞庫,支持熱更新分詞詞典。
jieba中文分詞器。
a、python中最流行的分詞系統,支持分詞和詞性標註。
b、支持繁體分詞,自定義分詞,並行分詞等等。
1四、自定義分詞,當自帶的分詞沒法知足需求時候,能夠自定義分詞。經過自定義Character Filters、Tokenizer和Token Filter實現。
1)、Character Filters。
a、在Tokenizer以前對原始文本進行處理,好比增長、刪除或者替換字符等等。
b、自帶的以下所示:
Html Strip去除html標籤和轉換html實體。
Mapping進行字符替換操做。
Pattern Replace進行正則匹配替換。
c、會影響後續Tokenizer解析的postion和offset的信息。
2)、Tokenizer。
a、將原始文本按照必定規則切分爲單詞(term or token)。
b、自帶的以下所示:
standard按照單詞進行分割。
letter按照非字符類進行分割。
whitespace按照空格進行分割。
UAX URL Email按照standard分割,但不會分割郵箱和url。
NGram和Edge NGram連詞分割。
Path Hierarchy按照文件路徑進行切割。
3)、Token Filter。
a、對於Tokenizer輸出的單詞(term)進行增長、刪除、修改等等操做。
b、自帶的以下所示:
lowercase將全部term轉換爲小寫。
stop刪除stop words。
NGram和Edge NGram連詞分割。
Synonym添加近義詞的term。
1五、分詞使用說明,索引時分詞和查詢時候分詞的選擇。
分詞使用說明,索引時分詞和查詢時候分詞的選擇。
1)、分詞會在以下兩個時機使用:
a、建立或者更新文檔的時候(Index Time),會對相應的文檔進行分詞處理。
b、查詢的時候(Search Time),會對查詢語句進行分詞。
2)、索引時分詞,是經過配置Index Mapping中每一個字段的analyzer屬性實現的,不指定分詞的時候,默認使用standard分詞器。
3)、查詢時分詞的指定方式有以下幾種。
a、查詢的時候經過analyzer指定分詞器。
b、經過index mapping設置search_analyzer實現,這個時候能夠設置查詢時分詞,同事設置查詢時分詞。
4)、通常狀況下,不須要特定指定查詢時分詞器,直接使用索引時分詞器便可,不然會出現沒法匹配的狀況。
5)、分詞的使用建議。
a、明確字段是否須要分詞,不須要分詞的字段就將type設置爲keyword,能夠節省空間和提升寫性能。
b、善用_analyze_api,查看文檔具體分詞結果。
c、多動手測試,查看文檔具體的分詞結果。
1六、Elasticsearch Mapping設置。相似數據庫中的表結構定義,主要做用以下所示:
a、定義Index下的字段名(Field Name)。
b、定義字段的類型,好比數據型,字符串型,布爾型等等。
c、定義倒排索引相關的配置,好比是否索引,記錄position等等。
如何獲取到一個索引Index的mapping呢,以下所示:
如何自定義mapping呢,自定義mapping的api,以下所示:
自定義Mapping注意事項。
1)、Mapping中的字段類型一旦設定之後,禁止直接修改,緣由如是所示,Lucene實現的倒排索引生成後不容許進行修改。
若是要進行修改字段類型的話,從新創建新的索引,而後作reindex操做。
2)、容許新增字段,經過dynamic參數來控制字段的新增。由於新增字段,類型不定,對於es來講,只是新增了一個倒排索引。dynamic參數是和properties一個級別的參數配置。
a、true(默認),容許自動新增字段。
b、false,不容許自動新增字段,可是文檔能夠正常寫入,但沒法對字段進行查詢等操做。
c、strict文檔不能寫入,報錯。
3)、copy_to參數,將該字段的值複製到目標字段,實現相似_all的做用,不會出如今_source中,只用來搜索使用。copy_to參數和type一個級別的參數。
4)、index參數,控制當前字段是否索引,默認爲true,即記錄索引,false不記錄,即不能夠搜索。index參數和type一個級別的參數。若是不但願被查詢便可設置爲false。
5)、index_options用於控制倒排索引記錄的內容,有以下4種配置。index_options參數和type一個級別的參數。
a、docs只記錄doc id。
b、freqs記錄doc id和term frequencies。
c、positions記錄doc id、term frequencies和term position。
d、offsets記錄doc id、term frequencies、term position和character offsets。
e、text類型默認配置爲positions,其餘默認配置爲docs。記錄內容越多,佔用空間越大。
6)、null_value,當字段遇到null值得時候得處理策略,默認爲null,即空值,此時es會忽略該值,能夠經過設定該值設定字段的默認值。null_value參數和type一個級別的參數。
更多參數詳見官網文檔便可。
1七、Elasticsearch的數據類型。
1)、核心的數據類型(字段field對應的類型type)。
a、字符串類型text(分詞的)、keyword(不分詞的)。
b、數值型:long、integer、short、byte、double、float、half_float、scaled_float。
c、布爾型:boolean。
d、日期:data。
e、二進制:binary。
f、範圍類型:interger_range、float_range、long_range、double_range、date_range。
2)、複雜數據類型。
a、數組類型array。
b、對象類型object。
c、嵌套類型nested object。
3)、地理位置數據類型。
a、geo_point。
b、geo_shape。
4)、專用類型。
a、記錄ip地址ip。
b、實現自動補全completion。
c、記錄分詞數token_count。
d、記錄字符串hash值murmur3。
e、percolator。
f、join。
5)、多字段特性multi_fields。
容許對同一個字段採用不一樣得配置,好比分詞,常見例子如對人名實現拼音搜索。只須要在人名種新增一個子字段爲pinyin便可。
1八、Dynamic Mapping,es能夠自動識別文檔字段類型,從而下降用戶使用成本,以下所示。
es是依靠json文檔的字段類型來實現自動識別字段類型,支持的類型以下所示:
1九、dynamic日期與數字識別。
1)、日期的自動識別能夠自行配置日期格式,以知足各類需求。
a、默認是["strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z || yyyy/MM/dd Z"]
b、strict_date_optional_time是ISO datetime的格式,完整格式相似下面所示:
YYYY-MM-DDThh:mm:ssTZD。例如,1994-07-12T19:20:30+01:00
c、dynamic_date_formats能夠自定義日期類型。該參數是在type參數下一級的參數。
d、date_detection能夠關閉日期自動識別的機制。該參數是在type參數下一級的參數。
2)、字符串是數字的時候,默認不會自動識別爲整數,由於字符串中出現數字是徹底合理的。
a、numeric_detection能夠開啓字符串中數字的自動識別。該參數是在type參數下一級的參數。
20、dynamic-template(動態模板)簡介。
1)、容許根據es自動識別的數據類型、字段名等來動態設定字段類型,能夠實現以下效果。
a、全部字符串類型都設定爲keyword類型,即默認不分詞的。
b、全部以message開頭的字段都設定爲text類型,即分詞。
c、全部以long_開頭的字段都設定爲long類型。
d、全部自動匹配爲double類型都設定爲float類型,以節省空間。
2)、匹配規則通常有以下幾個參數。
a、match_mapping_type匹配es自動識別的字段類型,如boolean、long、string等等。
b、match,unmatch匹配字段名。
c、path_match,path_unmatch匹配路徑。
3)、字符串默認使用keyword類型。es默認會爲字符串設置爲text類型,並增長一個keyword的子字段。
字符串默認使用keyword類型。es默認會爲字符串設置爲text類型,並增長一個keyword的子字段。
動態模板映射之後是這樣的。
以message開頭的字段都設置爲text類型。 dynamic_templates,數組,能夠指定多個匹配規則。能夠設定多個模板,執行順序,從上到下的。
2一、自定義mapping的建議。
自定義mapping的操做步驟以下所示。
a、寫一條文檔到es的臨時索引中,獲取es自動生成的mapping。
b、修改步驟a獲得的mapping,自定義相關配置。
c、使用步驟b的mapping建立實際所需索引。
最方便的是根據動態模板進行建立。
2二、索引模板。
a、索引模板,英文爲Index Template,主要用於在新建索引的時候自動應用預先設定的配置。簡化索引建立的操做步驟。
能夠設定索引的配置和mapping。
能夠有多個模板,根據order設置,order大的覆蓋小的配置。
做者:別先生
博客園:https://www.cnblogs.com/biehongli/
若是您想及時獲得我的撰寫文章以及著做的消息推送,能夠掃描上方二維碼,關注我的公衆號哦。