es,倒排索引
倒排索引的概念是基於MySQL這樣的正向索引而言的。
倒排索引中有兩個非常重要的概念:
- 文件(`Document`):用來搜尋的資料,其中的每一條資料就是一個文件。例如一個網頁、一個商品資訊
- 詞條(`Term`):對文件資料或使用者搜尋資料,利用某種演算法分詞,得到的具備含義的詞語就是詞條。例如:我是中國人,就可以分為:我、是、中國人、中國、國人這樣的幾個詞條
**建立倒排索引**是對正向索引的一種特殊處理,流程如下:
- 將每一個文件的資料利用演算法分詞,得到一個個詞條
- 建立表,每行資料包括詞條、詞條所在文件id、位置等資訊
- 因為詞條唯一性,可以給詞條建立索引,例如hash表結構索引
倒排索引的**搜尋流程**如下(以搜尋"華為手機"為例):
1)使用者輸入條件`"華為手機"`進行搜尋。
2)對使用者輸入內容**分詞**,得到詞條:`華為`、`手機`。
3)拿著詞條在倒排索引中查詢,可以得到包含詞條的文件id:1、2、3。
4)拿著文件id到正向索引中查詢具體文件。
那麼為什麼一個叫做正向索引,一個叫做倒排索引呢?
- **正向索引**是最傳統的,根據id索引的方式。但根據詞條查詢時,必須先逐條獲取每個文件,然後判斷文件中是否包含所需要的詞條,是**根據文件找詞條的過程**。
- 而**倒排索引**則相反,是先找到使用者要搜尋的詞條,根據詞條得到保護詞條的文件的id,然後根據id獲取文件。是**根據詞條找文件的過程**。
**正向索引**:
- 優點:
- 可以給多個欄位建立索引
- 根據索引欄位搜尋、排序速度非常快
- 缺點:
- 根據非索引欄位,或者索引欄位中的部分詞條查詢時,只能全表掃描。
**倒排索引**:
- 優點:
- 根據詞條搜尋、模糊搜尋時,速度非常快
- 缺點:
- 只能給詞條建立索引,而不是欄位
- 無法根據欄位做排序
- Mysql:擅長事務型別操作,可以確保資料的安全和一致性
- Elasticsearch:擅長海量資料的搜尋、分析、計算
索引庫的CRUD
1.建立索引庫和對映
- 請求方式:PUT
- 請求路徑:/索引庫名,可以自定義
- 請求引數:mapping對映
案例:
PUT /heima { "mappings": { "properties": { "info":{ "type": "text", "analyzer": "ik_smart" }, "email":{ "type": "keyword", "index": false }, "name":{ "type": "keyword", "index": false } } } }
2.查詢索引庫
- 請求方式:GET
- 請求路徑:/索引庫名
- 請求引數:無
案例
GET /heima
3.修改索引庫
倒排索引結構雖然不復雜,但是一旦資料結構改變(比如改變了分詞器),就需要重新建立倒排索引,這簡直是災難。因此索引庫**一旦建立,無法修改mapping**。
雖然無法修改mapping中已有的欄位,但是卻允許新增新的欄位到mapping中,因為不會對倒排索引產生影響。
PUT /heima/_mapping { "properties":{ "sex":{//新欄位名 "type": "keyword", "index": false } } }
4.刪除索引庫
- 請求方式:DELETE
- 請求路徑:/索引庫名
- 請求引數:無
DELETE /heima
文件操作
1.新增文件
POST /heima/_doc/1 { "name":"李白", "sex":"男", "email":"gs@163.com", "info":"java開發程式設計師" }