天天看點

elasticsearch(二) 快速入門

3 ES快速入門

ES作為一個索引及搜尋服務,對外提供豐富的REST接口,快速入門部分的執行個體使用head插件來測試,目的是對ES的使用方法及流程有個初步的認識。

3.1 建立索引庫

ES的索引庫是一個邏輯概念,它包括了分詞清單及文檔清單,同一個索引庫中存儲了相同類型的文檔。它就相當于MySQL中的表,或相當于Mongodb中的集合。

關于索引這個語:

索引(名詞):ES是基于Lucene建構的一個搜尋服務,它要從索引庫搜尋符合條件索引資料。

索引(動詞):索引庫剛建立起來是空的,将資料添加到索引庫的過程稱為索引。

下邊介紹兩種建立索引庫的方法,它們的工作原理是相同的,都是用戶端向ES服務發送指令。

1)使用postman或curl這樣的工具建立:

put ​​http://localhost:9200/​​索引庫名稱

{
"settings":{
"index":{
"number_of_shards":1,
"number_of_replicas":0
  }
    }
      }      

number_of_shards:設定分片的數量,在叢集中通常設定多個分片,表示一個索引庫将拆分成多片分别存儲不同的結點,提高了ES的處理能力和高可用性,入門程式使用單機環境,這裡設定為1。

number_of_replicas:設定副本的數量,設定副本是為了提高ES的高可靠性,單機環境設定為0.

如下是建立的例子,建立xc_course索引庫,共1個分片,0個副本:

  • 使用head插件建立

image.png

elasticsearch(二) 快速入門

image.png

3.2 建立映射

3.2.1 概念說明

在索引中每個文檔都包括了一個或多個field,建立映射就是向索引庫中建立field的過程,下邊是document和field與關系資料庫的概念的類比:

文檔(Document)----------------Row記錄

字段(Field)-------------------Columns 列

注意:6.0之前的版本有type(類型)概念,type相當于關系資料庫的表,ES官方将在ES9.0版本中徹底删除type。

上邊講的建立索引庫相當于關系資料庫中的資料庫還是表?

1、如果相當于資料庫就表示一個索引庫可以建立很多不同類型的文檔,這在ES中也是允許的。

2、如果相當于表就表示一個索引庫隻能存儲相同類型的文檔,ES官方建議 在一個索引庫中隻存儲相同類型的文檔。

3.2.2 建立映射

我們要把資訊存儲到ES中,這裡我們建立資訊的映射,先來一個簡單的映射,如下:

發送:post ​​​http://localhost:9200/​​​索引庫名稱/類型名稱/_mapping

建立類型為xc_course的映射,共包括三個字段:name、description、studymondel

由于ES6.0版本還沒有将type徹底删除,是以暫時把type起一個沒有特殊意義的名字。

post 請求:​​​http://localhost:9200/xc_course/doc/_mapping​​ 表示:在xc_course索引庫下的doc類型下建立映射。doc是類型名,可以自定義,在ES6.0中要弱化類型的概念,給它起一個沒有具體業務意義的名稱。

{
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"studymodel": {
"type": "keyword"
    }
  }
 }      

映射建立成功,檢視head界面:

elasticsearch(二) 快速入門

image.png

3.3 建立文檔

ES中的文檔相當于MySQL資料庫表中的記錄。

發送:put 或Post ​​​http://localhost:9200/xc_course/doc/id​​​值

(如果不指定id值ES會自動生成ID)

​​http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000​​

{
"name":"Bootstrap開發架構",
"description":"Bootstrap是由Twitter推出的一個前台頁面開發架構,在行業之中使用較為廣泛。此開發架構包含了大量的CSS、JS程式代碼,可以幫助開發者(尤其是不擅長頁面開發的程式人員)輕松的實作一個不受浏覽器限制的精美界面效果。",
"studymodel":"201001"
}      

使用postman測試:

elasticsearch(二) 快速入門

image.png

通過head查詢資料:

elasticsearch(二) 快速入門

image.png

3.4 搜尋文檔

1、根據課程id查詢文檔

發送:get ​​​http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000​​ 使用postman測試:

elasticsearch(二) 快速入門

image.png

2、查詢所有記錄

發送 get ​​​http://localhost:9200/xc_course/doc/_search​​ 3、查詢名稱中包括spring 關鍵字的的記錄

發送:get ​​http://localhost:9200/xc_course/doc/_search?q=name:bootstrap​​ 4、查詢學習模式為201001的記錄

發送 get ​​​http://localhost:9200/xc_course/doc/_search?q=studymodel:201001​​

3.4.1查詢結果分析

{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 1,
        "hits": [
            {
                "_index": "xc_course",
                "_type": "doc",
                "_id": "4028e58161bcf7f40161bcf8b77c0000",
                "_score": 1,
                "_source": {
                    "name": "Bootstrap開發架構",
                    "description": "Bootstrap是由Twitter推出的一個前台頁面開發架構,在行業之中使用較為廣泛。此開發架構包含了大量的CSS、JS程式代碼,可以幫助開發者(尤其是不擅長頁面開發的程式人員)輕松的實作一個不受浏覽器限制的精美界面效果。",
                    "studymodel": "201001"
                }
            }
        ]
    }
}      

took:本次操作花費的時間,機關為毫秒。

timed_out:請求是否逾時

_shards:說明本次操作共搜尋了哪些分片

hits:搜尋命中的記錄

hits.total : 符合條件的文檔總數 hits.hits :比對度較高的前N個文檔

hits.max_score:文檔比對得分,這裡為最高分

_score:每個文檔都有一個比對度得分,按照降序排列。

_source:顯示了文檔的原始内容。

4 IK分詞器

4.1測試分詞器

在添加文檔時會進行分詞,索引中存放的就是一個一個的詞(term),當你去搜尋時就是拿關鍵字去比對詞,最終找到詞關聯的文檔。

測試目前索引庫使用的分詞器:

post 發送:localhost:9200/_analyze

{"text":"測試分詞器,後邊是測試内容:spring cloud實戰"}

結果如下:

elasticsearch(二) 快速入門

image.png

會發現分詞的效果将 “測試” 這個詞拆分成兩個單字“測”和“試”,這是因為目前索引庫使用的分詞器對中文就是單字分詞。

4.2 安裝IK分詞器

使用IK分詞器可以實作對中文分詞的效果。

下載下傳IK分詞器:(Github位址:​​​https://github.com/medcl/elasticsearch-analysis-ik​​​)

下載下傳zip:解壓,并将解壓的檔案拷貝到ES安裝目錄的plugins下的ik目錄下

elasticsearch(二) 快速入門

image.png

測試分詞效果:

發送:post localhost:9200/_analyze

{"text":"測試分詞器,後邊是測試内容:spring cloud實戰","analyzer":"ik_max_word" }

elasticsearch(二) 快速入門

image.png

4.3 兩種分詞模式

ik分詞器有兩種分詞模式:ik_max_word和ik_smart模式。

1、ik_max_word

會将文本做最細粒度的拆分,比如會将“中華人民共和國人民大會堂”拆分為“中華人民共和國、中華人民、中華、華人、人民共和國、人民、共和國、大會堂、大會、會堂等詞語。

2、ik_smart

會做最粗粒度的拆分,比如會将“中華人民共和國人民大會堂”拆分為中華人民共和國、人民大會堂。

4.4 自定義詞庫

如果要讓分詞器支援一些專有詞語,可以自定義詞庫。

iK分詞器自帶一個main.dic的檔案,此檔案為詞庫檔案。

elasticsearch(二) 快速入門

image.png

打開IKAnalyzer.cfg.xml配置一下

elasticsearch(二) 快速入門

image.png

在上邊的目錄中建立一個my.dic檔案(注意檔案格式為utf-8(不要選擇utf-8 BOM))

可以在其中自定義詞彙:

比如定義:

elasticsearch(二) 快速入門

image.png

重新開機ES,測試分詞效果:

發送:post localhost:9200/_analyze

elasticsearch(二) 快速入門

image.png

6 映射類型

6.1 映射維護方法

1、查詢所有索引的映射:

GET: ​​​http://localhost:9200/_mapping​​ 2、建立映射

post 請求:​​http://localhost:9200/xc_course/doc/_mapping​​ 一個例子:

{
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"studymodel": {
"type": "keyword"
    }
  }
}      

3、更新映射

映射建立成功可以添加新字段,已有字段不允許更新。

4、删除映射

通過删除索引來删除映射。

6.2 常用映射類型

6.2.1 text文本字段

字元串包括text和keyword兩種類型:

1、text

1)analyzer

通過analyzer屬性指定分詞器。

下邊指定name的字段類型為text,使用ik分詞器的ik_max_word分詞模式。

"name": {
"type": "text",
"analyzer":"ik_max_word"
}      

上邊指定了analyzer是指在索引和搜尋都使用ik_max_word,如果單獨想定義搜尋時使用的分詞器則可以通過search_analyzer屬性。

對于ik分詞器建議是索引時使用ik_max_word将搜尋内容進行細粒度分詞,搜尋時使用ik_smart提高搜尋精确性

"name": {
"type": "text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
}      

2)index

通過index屬性指定是否索引。

預設為index=true,即要進行索引,隻有進行索引才可以從索引庫搜尋到。

但是也有一些内容不需要索引,比如:商品圖檔位址隻被用來展示圖檔,不進行搜尋圖檔,此時可以将index設定

為false。

删除索引,重新建立映射,将pic的index設定為false,嘗試根據pic去搜尋,結果搜尋不到資料

pic": {
"type": "text",
"index":false
}      

3)store

是否在source之外存儲,每個文檔索引後會在 ES中儲存一份原始文檔,存放在"_source"中,一般情況下不需要設定store為true,因為在_source中已經有一份原始文檔了。

6.2.2 keyword關鍵字字段

上邊介紹的text文本字段在映射時要設定分詞器,keyword字段為關鍵字字段,通常搜尋keyword是按照整體搜尋,是以建立keyword字段的索引時是不進行分詞的,比如:郵政編碼、手機号碼、身份證等。keyword字段通常用于過慮、排序、聚合等。

6.2.3 date日期類型

日期類型不用設定分詞器。

通常日期類型的字段用于排序。

1)format

通過format設定日期格式

例子:

下邊的設定允許date字段存儲年月日時分秒、年月日及毫秒三種格式。

{
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd"
    }
  }
}      

6.2.4 數值類型

下邊是ES支援的數值類型

1、盡量選擇範圍小的類型,提高搜尋效率

2、對于浮點數盡量用比例因子,比如一個價格字段,機關為元,我們将比例因子設定為100這在ES中會按 分 存儲,映射如下:

"price": {
"type": "scaled_float",
"scaling_factor": 100
}      

繼續閱讀