天天看點

Elaticsearch基本使用

get _cat/nodes

示例:

Elaticsearch基本使用

檢視索引設定請求格式:

get /索引庫名

檢視所有索引庫配置

get *
Elaticsearch基本使用

删除索引請求格式:

delete /索引庫名

示例:

Elaticsearch基本使用

使用head請求,檢視索引是否存在:

head /索引庫名
Elaticsearch基本使用

[]( )映射配置

索引有了,接下來肯定是添加資料。但是,在添加資料之前必須定義映射。映射是定義文檔的過程,文檔包含哪些字段,這些字段是否儲存,是否索引,是否分詞等,配置清楚映射,elasticsearch會幫我們進行索引庫的建立。

建立映射字段:

put /索引庫名/_mapping/類型名稱

{

"properties": {

"字段名": {

"type": "類型",

"index": true,

"store": true,

"analyzer": "分詞器"

}

類型名稱:就是前面将的type的概念,類似于資料庫中的不同表

字段名:任意填寫 ,可以指定許多屬性,例如:

type:類型,可以是text、long、short、date、integer、object等

index:是否索引,預設為true

store:是否存儲,預設為false

analyzer:分詞器,這裡的<code>ik_max_word</code>即使用ik分詞器

字段屬性詳解:

type:資料類型

string類型,分兩種:

<code>text:</code>可分詞,不可參與聚合

<code>keyword:</code>不可分詞,資料會作為完整字段進行比對,可以參與聚合

numerical:數值類型,分兩類

基本資料類型:<code>long、interger、short、byte、double、float、half_float</code>

浮點數的高精度類型:<code>scaled_float</code>,需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子後存儲,取出時再還原。

date:日期類型, elasticsearch可以對日期格式化為字元串存儲,但是建議我們存儲為毫秒值,存儲為long,節省空間。

index:影響字段的索引情況

true:字段會被索引,則可以用來進行搜尋。預設值就是true,你不進行任何配置,字段就會被索引

false:字段不會被索引,不能用來搜尋,有些字段是我們不希望被索引的,需要手動設定index為false

store:是否将資料進行額外存儲。

elasticsearch在建立文檔索引時,會将文檔中的原始資料備份,儲存到一個叫做<code>_source</code>的屬性中。而且我們可以通過過濾<code>_source</code>來選擇哪些要顯示,哪些不顯示。而如果設定store為true,就會在<code>_source</code>以外額外存儲一份資料,多餘,是以一般我們都會将store設定為false,事實上,store的預設值就是false。

boost:激勵因子,與lucene中一樣

示例:發起請求

Elaticsearch基本使用

檢視映射關系:

get /索引庫名/_mapping
Elaticsearch基本使用

[]( )新增資料

通過post請求,可以向一個已經存在的索引庫中添加資料。

post /索引庫名/類型名

"key":"value"

Elaticsearch基本使用

查詢資料:

get _search

"query":{

"match_all":{}

Elaticsearch基本使用

智能判斷: 事實上elasticsearch非常智能,你不需要給索引庫設定任何mapping映射,它也可以根據你輸入的資料來判斷類型,動态添加資料映射。

測試一下:

post /ly/goods/2

"title":"蘋果手機",

"images":"http://image.ly.com/12479122.jpg",

"price":2899.00,

"stock": 200,

"saleable":true

額外添加了stock庫存,和saleable是否上架兩個字段。檢視結果:

Elaticsearch基本使用

在看下索引庫的映射關系:

Elaticsearch基本使用

[]( )修改資料

把剛才新增的請求方式改為put,就是修改了。不過修改必須指定id,

id對應文檔存在,則修改

id對應文檔不存在,則新增

[]( )删除資料

删除使用delete請求,同樣,需要根據id進行删除:

delete /索引庫名/類型名/id值
Elaticsearch基本使用

[]( )查詢

基本查詢:

get /索引庫名/_search

"查詢類型":{

"查詢條件":"查詢條件值"

這裡的query代表一個查詢對象,裡面可以有不同的查詢屬性

查詢類型:<code>match_all</code>, <code>match</code>,<code>term</code> , <code>range</code> 等等

查詢條件:查詢條件會根據類型的不同,寫法也有差異,後面詳細講解

查詢所有(match_all):

get /ly/_search

"match_all": {}

Elaticsearch基本使用

比對查詢(match):

添加資料,便于測試:

put /ly/goods/2

"price":3899.00

put /ly/goods/3

"title":"華為手機",

"price":1899.00

put /ly/goods/4

"title":"小米電視",

"price":5899.00

or關系: <code>match</code>類型查詢,會把查詢條件進行分詞,然後進行查詢,多個詞條之間是or的關系

get /heima/_search

"match":{

"title":"小米電視"

結果:

Elaticsearch基本使用

在上面的案例中,不僅會查詢到電視,而且與小米相關的都會查詢到,多個詞之間是<code>or</code>的關系。

and關系: 某些情況下,我們需要更精确查找,我們希望這個關系變成<code>and</code>,可以這樣做:

"match": {

"title": {

"query": "小米電視",

"operator": "and"

Elaticsearch基本使用

本例中,隻有同時包含<code>小米</code>和<code>電視</code>的詞條才會被搜尋到。

or和and之間:

在 <code>or</code> 與 <code>and</code> 間二選一有點過于非黑即白。 如果使用者給定的條件分詞後有 5 個查詢詞項,想查找隻包含其中 4 個詞的文檔,該如何處理?我們如何獲得處于中間的某種結果?

<code>match</code> 查詢支援 <code>minimum_should_match</code> 最小比對參數, 這讓我們可以指定必須比對的詞項數用來表示一個文檔是否相關。我們可以将其設定為某個具體數字,更常用的做法是将其設定為一個<code>百分數</code>,因為我們無法控制使用者搜尋時輸入的單詞數量:

"title":{

"query":"小米曲面電視",

"minimum_should_match": "75%"

Elaticsearch基本使用

多字段查詢(multi_match):

<code>multi_match</code>與<code>match</code>類似,不同的是它可以在多個字段中查詢

"multi_match": {

"query": "小米",

"fields": [ "title", "subtitle" ]

Elaticsearch基本使用

詞條比對(term):

<code>term</code> 查詢被用于精确值 比對,這些精确值可能是數字、時間、布爾或者那些未分詞的字元串

"term":{

"price":2699.00

Elaticsearch基本使用

多詞條精确比對(terms):

<code>terms</code> 查詢和 term 查詢一樣,但它允許你指定多值進行比對。如果這個字段包含了指定值中的任何一個值,那麼這個文檔滿足條件:

"terms":{

"price":[1899.00,3899.00]

Elaticsearch基本使用

[]( )結果過濾

預設情況下,elasticsearch在搜尋的結果中,會把文檔中儲存在<code>_source</code>的所有字段都傳回。如果我們隻想擷取其中的部分字段,我們可以添加<code>_source</code>的過濾

直接指定字段:

"_source": ["title","price"],

"query": {

"term": {

"price": 2699

傳回的結果:

Elaticsearch基本使用

指定includes和excludes:

可以通過:

<code>includes:</code>來指定想要顯示的字段

<code>excludes:</code>來指定不想要顯示的字段

"_source": {

"includes":["title","price"]

},