Elasticsearch也是基於Lucene的全文檢索庫,本質也是存儲數據,很多概念與MySQL類似的。
對比關係:
索引(indices)--------------------------------Databases 數據庫
類型(type)-----------------------------Table 數據表
文檔(Document)----------------Row 行
字段(Field)-------------------Columns 列
Elasticsearch具備以下特點:
- 分佈式,無需人工搭建集羣(solr就需要人爲配置,使用Zookeeper作爲註冊中心)
- Restful風格,一切API都遵循Rest原則,容易上手
- 近實時搜索,數據更新在Elasticsearch中幾乎是完全同步的。
另外,在SolrCloud中,有一些集羣相關的概念,在Elasticsearch也有類似的:
- 索引集(Indices,index的複數):邏輯上的完整索引
- 分片(shard):數據拆分後的各個部分
- 副本(replica):每個分片的複製
要注意的是:Elasticsearch本身就是分佈式的,因此即便你只有一個節點,Elasticsearch默認也會對你的數據進行分片和副本操作,當你向集羣添加新數據時,數據也會在新加入的節點中進行平衡。
創建索引:
- 請求方式:PUT
- 請求路徑:/索引庫名
- 請求參數:json格式:
```json
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
```
- settings:索引庫的設置
- number_of_shards:分片數量
- number_of_replicas:副本數量
刪除索引:
DELETE /heima
查看索引:
GET /heima
接着創建映射
PUT /索引庫名/_mapping/類型名稱
{
"properties": {
"字段名": {
"type": "類型",
"index": true,
"store": true,
"analyzer": "分詞器"
}
}
}
PUT /heima/_mapping/goods
{
"properties": {
"title":{
"type" : "text",
"analyzer" : "ik_max_word"
},
"image":{
"type" : "keyword",
"index" : false
},
"price":{
"type" : "float"
}
}
}
通過POST請求,可以向一個已經存在的索引庫中添加數據。
簡單新增
POST /heima/goods/
{
"title":"小米手機",
"images":"http://image.leyou.com/12479122.jpg",
"price":2699.00
}
查詢所有
GET heima/_search
{
"query": {"match_all":{}}
}
根據id查詢單個
GET heima/goods/1
不加映射也能智能推斷保存數據
但是關於String
實驗:post 大米手機 超大米手機 小米手機 紅米手機
查詢到四個,因爲映射了有分詞器並且默認是or
改成and後查詢到兩個
term查詢精確查詢,這裏的大米手機相當於一個詞條,只匹配不分詞條的字段(除text外的字段),所有查詢到0個
查詢到4個
因爲手機作爲一個詞條 能匹配到已經分好詞後的大米手機,小米手機等
結果過濾
對搜索完的結果返回的數據進行過濾,includes/excludes選一
`fuzzy` 查詢是 `term` 查詢的模糊等價。有一定的容錯,能查出apple手機
range對數值字段進行範圍查詢
bool /must 多個條件同時滿足
bool /should 多個條件滿足一個即可
bool /must_not 多個條件同時不滿足
當多個條件時價格應是一個過濾條件,不應該影響查詢後的得分
所以上面寫的不合適
bool /must,filter各一個條件這樣不影響得分不影響高亮
查詢排序分頁
聚合
桶:
桶的作用,是按照某種方式對數據進行分組,每一組數據在ES中稱爲一個`桶`
Elasticsearch中提供的劃分桶的方式有很多:
- Date Histogram Aggregation:根據日期階梯分組,例如給定階梯爲周,會自動每週分爲一組
- Histogram Aggregation:根據數值階梯分組,與日期類似
- Terms Aggregation:根據詞條內容分組,詞條內容完全匹配的爲一組
- Range Aggregation:數值和日期的範圍分組,指定開始和結束,然後按段分組
-Avg Aggregation:數值的平均值聚合
度量(metrics)
分組完成以後,我們一般會對組中的數據進行聚合運算,例如求平均值、最大、最小、求和等,這些在ES中稱爲`度量`
**注意**:在ES中,需要進行聚合、排序、過濾的字段其處理方式比較特殊,因此不能被分詞。
- Terms Aggregation:按照生產商分組
在按照生產商分組的前提下計算每組的平均值
查詢聚合一塊使用,聚合需要的數據是查詢得到的數據