elasticsearch相關

张碧晨發表於2024-04-16

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開發程式設計師"
}