1、經常使用術語
索引(Index)、類型(Type)、文檔(Document)
- 索引Index是含有相同屬性的文檔集合。索引在ES中是經過一個名字來識別的,且必須是英文字母小寫,且不含中劃線(-);可類比於 MySQL 中的 database ;在 7.0中,因爲類型(Type)的移除,咱們能夠理解爲,一個索引就是一張 table。
- 一個索引中能夠定義一個或多個類型Type,文檔必須屬於一個類型;可類比於 MySQL 中的 table;
- 文檔Document是能夠被索引的基本數據單位。文檔是Elasticsearch中最小的數據存儲單位。可類比於 MySQL 中 一個table 中的一行記錄
注意事項:
從ES6.0開始,官方便不建議一個索引中建立多個類型;在ES7.0中,更是移除了類型(Type)這個概念。爲何呢?
在Elasticsearch索引中,不一樣類型(Type)中具備相同名稱的字段在內部由相同的Lucene字段支持。一個index中多個Type在Lucene中會有許多問題。具體的能夠參考官方說明:Removal of mapping typeshtml
節點Node、集羣Cluster
- 節點:一個ES運行實例,是集羣的的構成單元
- 集羣:由1個(只有1個節點也是1個集羣)或多個節點組成,對外提供服務
分片Shard(集羣—提升吞吐與計算性能)、副本Replica(主從—提升可用性)
- 在ES中,每一個索引都有多個分片,每一個分片都是一個Lucene索引。假設一個索引的數據量很大,就會形成硬盤壓力很大,同時,搜索速度也會出現瓶頸。咱們能夠將一個索引分爲多個分片,從而分攤壓力;分片同時還容許用戶進行水平地擴展和拆分,以及分佈式的操做,能夠提升搜索以及其餘操做的效率。
- 拷貝一份分片,就完成了分片的備份。備份的好處是,當一個主分片出現問題時,備份的分片就能代替工做,從而提升了ES的可用性。同時,備份的分片還能夠執行搜索操做,以分攤搜索的壓力。ES禁止同一個分片的主分片和副本分片在同一個節點上。
RESTful API
Elasticsearch 集羣對外提供 RESTful APIjava
- REST - REpresentational State Transfer
- URI 指定資源,如Index、Document等
- Http Method 指明資源操做類型,如GET、POST、PUT、DELETE等
倒排索引
-
正排索引node
正排索引

倒排索引

全文檢索查詢流程
倒排索引組成
倒排索引是搜索引擎的核心,主要包含兩部分:python
- 單詞詞典(Term Dictionary)
- 記錄全部文檔的單詞,通常都比較大
- 記錄單詞到倒排列表的關聯信息
- 單詞字典的實現通常是用B+Tree,能兼顧內存與磁盤性能,保障增刪改查高效
- 倒排列表(Posting List)
- 倒排列表(Posting List)記錄了單詞對應的文檔集合,由倒排索引項(Posting)組成
- 倒排索引項(Posting)主要包含以下信息:
- 文檔ld,用於獲取原始信息
- 單詞頻率(TF,Term Frequency),記錄該單詞在該文檔中的出現次數,用於後續相關性算分
- 位置(Position),記錄單詞在文檔中的分詞位置(多個),用於作詞語搜索(Phrase Query)
- 偏移(Offset),記錄單詞在文檔的開始和結束位置,用於作高亮顯示

倒排列表例子

單詞字典指向倒排列表例子
ES中的倒排索引
es存儲的是一個json格式的文檔,其中包含多個字段,每一個字段會有本身的倒排索引。nginx

ES中倒排索引
相關性算分
相關性算分是指文檔與查詢語句間的相關度,英文爲 relevancegit
- 經過倒排索引能夠獲取與查詢語句相匹配的文檔列表,那麼如何將最符合用戶查詢需求的文檔放到前列呢?
- 本質是一個排序問題,排序的依據是相關性算分

相關性算分的幾個重要概念
- Term Frequency(TF)詞頻,即單詞在該文檔中出現的次數。詞頻越高,相關度越高
- Document Frequency(DF)文檔頻率,即單詞出現的文檔數
- Inverse Document Frequency(IDF)逆向文檔頻率,與文檔頻率相反,簡單理解爲1/DF。即單詞出現的文檔數越少,相關度越高
- Field-length Norm 文檔越短,相關性越高
使用 explain 參數查看具體的計算方法
- es的算分是按照shard進行的,即shard的分數計算是相互獨立的,因此在使用explain的時候注意分片數
-
能夠經過設置索引的分片數爲1來避免這個問題es6
ES中的相關性算分模型
- TF/IDF 模型
- BM25 模型5.x以後的默認模型
TF/IDF 模型

BM25 模型


BM25 模型對比TF/IDF 模型
2、Document API
1. 文檔是一個Json Object,由字段(Field)組成,常見數據類型以下:
- 字符串:text,keyword(不分詞)
- 數值型:long,integer,short byte,double,float,half float,scaled_float
- 布爾:boolean
- 日期:date
- 二進制:binary
- 範圍類型:integer_range,float_range,long_range,double_range,date_range
2. 文檔元數據,用於標註文檔的相關信息
- _index:文檔所在的索引名
- _type:文檔所在的類型名(7.0後默認_doc)
- _id:文檔惟一id
- _uid:組合id,由_type和_id組成(6.x_type再也不起做用,所以同_id值同樣),默認禁用
- _source:文檔的原始Json數據,能夠從這裏獲取每一個字段的內容
- _all:整合全部字段內容到該字段,默認禁用
3. 每一個文檔有惟一的_Id標識
- 自行指定
- es自動生成
4. 文檔API
- es有專門的Document API,建立文檔,查詢文檔,更新文檔,刪除文檔
建立文檔(建立文檔時,若是索引不存在,es會自動建立對應的index和type)
- 指定id建立文檔
PUT /test_index/_doc/1
{
"username":"zhangsan", "age":1 }

指定ID建立文檔
- 不指定id建立文檔
POST /test_index/_doc
{
"username":"lisi", "sex":2 }

不指定ID建立文檔
查詢文檔
- 指定要查詢的文檔id
GET /test_index/_doc/1

指定要查詢的文檔id
- 搜索全部文檔,用到_search
GET /test_index/_search # GET /test_index/_doc/_search在高版本提示類型已過時,所以不用指定type了

搜索全部文檔
批量增刪改查文檔
- ES容許一次建立多個文檔,從而減小網絡傳輸開銷,提高寫入速率,endpoint爲_bulk
- index 用於建立文檔,文檔已存在則更細文檔
- create 一樣能夠建立文檔,文檔已存在則返回錯誤
- delete 用於刪除文檔
- update 用於更新文檔,文檔不存在則返回錯誤
- 在es6.0以後的版本能夠省略_type,官方已捨棄_type這個概念
POST _bulk
{"index":{"_index":"test_index","_id":"3"}} {"username":"alfred","age":10} {"create":{"_index":"test_index","_id":"3"}} {"username":"alfred2","age":110} {"delete":{"_index":"test_index","_id":"1"}} {"update":{"_id":"2","_index":"test_index"}} {"doc":{"age":"20"}}
返回:github
{ "took" : 18, "errors" : true, "items" : [ { "index" : { "_index" : "test_index", "_type" : "_doc", "_id" : "3", "_version" : 2, "result" : "updated", "_shards" : { "total" : 2, "successful" : 2, "failed" : 0 }, "_seq_no" : 4, "_primary_term" : 1, "status" : 200 } }, { "create" : { "_index" : "test_index", "_type" : "_doc", "_id" : "3", "status" : 409, "error" : { "type" : "version_conflict_engine_exception", "reason" : "[3]: version conflict, document already exists (current version [2])", "index_uuid" : "jjJIqT7QSeaYcOeWxxY-og", "shard" : "0", "index" : "test_index" } } }, { "delete" : { "_index" : "test_index", "_type" : "_doc", "_id" : "1", "_version" : 3, "result" : "not_found", "_shards" : { "total" : 2, "successful" : 2, "failed" : 0 }, "_seq_no" : 5, "_primary_term" : 1, "status" : 404 } }, { "update" : { "_index" :