Elasticsearch 資料搜尋篇

2021-09-09 04:33:10 字數 3752 閱讀 3386

curl 'localhost:9200/_cat/indices?v'health index pri rep docs.count docs.deleted store.size pri.store.size

yellow bank 5 1 1000 0 424.4kb 424.4kb

es提供了兩種搜尋的方式:請求引數方式請求體方式

請求引數方式

curl 'localhost:9200/bank/_search?q=*&pretty'

其中bank是查詢的索引名稱,q後面跟著搜尋的條件:q=*表示查詢所有的內容

請求體方式(推薦這種方式)

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

} }'

這種方式會把查詢的內容放入body中,會造成一定的開銷,但是易於理解。在平時的練習中,推薦這種方式。

返回的內容

, "hits":  },  },  } }

query定義了查詢,match_all宣告了查詢的型別。還有其他的引數可以控制返回的結果:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

}, "size": 1}'

上面的命令返回了所有文件資料中的第一條文件。如果size不指定,那麼預設返回10條。

下面的命令請求了第10-20的文件。

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

}, "from": 10, "size": 10}'

下面的命令指定了文件返回的排序方式:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

}, "sort": } }'

上面了解了基本的搜尋語句,下面就開始深入一些常用的dsl了。

之前的返回資料都是返回文件的所有內容,這種對於網路的開銷肯定是有影響的,下面的例子就指定了返回特定的字段:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

}, "_source": ["account_number", "balance"] }'

再回到query,之前的查詢都是查詢所有的文件,並不能稱之為搜尋引擎。下面就通過match方式查詢特定欄位的特定內容,比如查詢餘額為20的賬戶資訊:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

} }'

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

} }'

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

} }'

如果我們想要返回同時包含mill和lane的,可以通過match_phrase查詢:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

} }'

es提供了bool查詢,可以把很多小的查詢組成乙個更為複雜的查詢,比如查詢同時包含mill和lane的文件:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

}, } ] } } }'

修改bool引數,可以改為查詢包含mill或者lane的文件:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

}, } ] } } }'

也可以改寫為must_not,排除包含mill和lane的文件:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

}, } ] } } }'

bool查詢可以同時使用must, should, must_not組成乙個複雜的查詢:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

} ], "must_not": [ } ] } } }'

之前說過score欄位指定了文件的分數,使用查詢會計算文件的分數,最後通過分數確定哪些文件更相關,返回哪些文件。

有的時候我們可能對分數不感興趣,就可以使用filter進行過濾,它不會去計算分值,因此效率也就更高一些。

filter過濾可以巢狀在bool查詢內部使用,比如想要查詢在2000-3000範圍內的所有文件,可以執行下面的命令:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

}, "filter": } } } } }'

es除了上面介紹過的範圍查詢range、match_all、match、bool、filter還有很多其他的查詢方式,這裡就先不一一說明了。

聚合提供了使用者進行分組和數理統計的能力,可以把聚合理解成sql中的group by和分組函式。在es中,你可以在一次搜尋查詢的時間內,即完成搜尋操作也完成聚合操作,這樣就降低了多次使用rest api造成的網路開銷。

下面就是通過terms聚合的簡單樣例:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

} } }'

它類似於sql中的下面的語句:

select state, count(*) from bank group by state order by count(*) desc

返回的資料:

"hits": , "aggregations": , , , , , , , , ,  ] } } }

由於size設定為0,它並沒有返回文件的資訊,只是返回了聚合的結果。

比如統計不同賬戶狀態下的平均餘額:

curl -xpost 'localhost:9200/bank/_search?pretty' -d '

, "aggs": } } } } }'

聚合支援巢狀,舉個例子,先按範圍分組,在統計不同性別的賬戶餘額:

curl -xpost

'localhost:9200/bank/_search?pretty' -d '

, ,  ] }, "aggs": , "aggs":  } } } } } } }'

聚合可以實現很多複雜的功能,而且es也提供了很多複雜的聚合,這裡作為引導篇,也不過多介紹了。

Elasticsearch 搜尋資料

elasticsearch 修改資料 elasticsearch 搜尋資料 現在我們已經了解了基本知識,讓我們嘗試使用更真實的資料。我們提供了一些虛構的客戶銀行賬戶資訊,格式如下所示 curl localhost 9200 cat indices?v 響應 health status index u...

二 elasticsearch入門(資料)

程式中大多的實體或物件能夠被序列化為包含鍵值對的json物件,鍵 key 是字段 field 或屬性 property 的名字,值 value 可以是字串 數字 波爾型別 另乙個物件 值陣列或者其他特殊型別,比如表示日期的字串或者表示地理位置的物件。accounts 文件元資料 乙個文件不只有資料。...

elasticSearch修改資料

elasticsearch幾乎能實時提供資料操作和搜尋功能。預設情況下,從開始索引 更新 刪除資料到出現搜尋結果的時間可以認為需要一秒的時間。這是與sql等其他平台的重要區別,其中資料在事務完成後可以立即使用。在上節中我們給索引建立了乙個文件,命令為 put customer doc 1 prett...