和我一起打造個簡單搜尋之ElasticSearch入門
阿新 • • 發佈:2018-11-15
本文簡單介紹了使用 Rest 介面,對 es 進行操作,更深入的學習,可以參考文末部分。
環境
本文以及後續 es 系列文章都基於 5.5.3 這個版本的 elasticsearch ,這個版本比較穩定,可以用於生產環境。
系列文章
- 一、和我一起打造個簡單搜尋之ElasticSearch叢集搭建
- 二、和我一起打造個簡單搜尋之ElasticSearch入門
- 三、和我一起打造個簡單搜尋之IK分詞以及拼音分詞
- 四、和我一起打造個簡單搜尋之Logstash實時同步建立索引
- 五、和我一起打造個簡單搜尋之SpringDataElasticSearch入門
- 六、和我一起打造個簡單搜尋之SpringDataElasticSearch關鍵詞高亮
- ...
基礎概念
索引--相當於資料庫
型別--相當於表
文件--相當於一條記錄
分片--對索引進行分片,分佈於叢集各個節點上,降低單個節點的壓力
備份--拷貝分片就完成了備份
基本語法
索引
索引型別
- 結構化索引
- 特點:通過介面建立,可以指定 mappings
- url:port/索引名/型別名/_mappings
- 非結構化索引
- 特點:通過 elasticsearch head 建立 mapping 為空
使用 RestClient/PostMan 建立結構化索引
建立一個 people 的索引,包含一個型別 man
{ "settings":{ "number_of_shards":3, "number_of_replicas":1 }, "mappings":{ "man":{ "properties":{ "name":{ "type":"text" }, "country":{ "type":"keyword" }, "age":{ "type":"integer" }, "date":{ "type":"date", "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } } }
keyword 與 text 的區別
type 型別為 keyword 的時候,ES 不會對其進行分詞,而 text 會被分詞
es 通過 rest 介面對資料操作
插入資料
- 指定文件 id 插入
- PUT 請求: ip:port/索引/型別/id
- PUT 請求: ip:port/索引/型別/id
- 自動產生文件 id 插入
- POST 請求: ip:port/索引/型別
- POST 請求: ip:port/索引/型別
修改資料
- 直接修改
- POST 請求: ip:port/索引/型別/id/_update
- POST 請求: ip:port/索引/型別/id/_update
刪除資料/刪除索引
- 刪除文件
- DELETE 請求 ip:埠/索引/型別/id
- 刪除索引
- DELETE 請求 ip:埠/索引
查詢資料
- 簡單查詢
- GET 請求: ip:埠/索引/型別/id
- 條件查詢
- POST請求: ip:埠/索引/_search
- 指定條件查詢,分頁與排序
json { "query":{ "match":{ "name":"WeJan" } }, "sort":[ { "age":{ "order":"asc" } } ], "from" : 0, "size" : 10 }
- 聚合查詢
- POST請求: ip:埠/索引/_search
- 分組,可以多個分組
json { "aggs":{ "group_by_age":{ "terms":{ "field":"age" } } } }
- 聚合計算
json { "aggs":{ "age_count":{ "stats":{ "field":"age" } } } }
- sum
- avg
- max
- min
- count
高階查詢
- 習語匹配(全詞匹配)
json { "query":{ "match_phrase":{ "name":"WeJan" } } }
- 多欄位匹配,多個欄位包含query
json { "query":{ "multi_match":{ "query":"WeJan", "fields":["author", "title"] } } }
query_string 文字查詢
json { "query":{ "query_string":{ "name":"(WeJan AND Jan) OR 哈哈" } } }
針對多個欄位的文字查詢
json { "query":{ "query_string":{ "name":"WeJan OR 哈哈", "fields":["author", "title"] } } }
欄位查詢,比如年齡,分類
json { "query":{ "term":{ "age":25 } } }
範圍查詢,可以對時間欄位進行查詢,現在使用 "now"替代
json { "query":{ "range":{ "age":{ "gte":26, "lte":36 } } } }