前言
es是一個強大的搜索引擎,目前知名公司內部都在使用!
因爲Elasticsearch 是一個基於 Apache Lucene™ 的開源搜索引擎。無論在開源還是專有領域,Lucene 可以被認爲是迄今爲止最先進、性能最好的、功能最全的搜索引擎庫。
首先我們要知道,es雖然強大,但是不方便操作,所以我們需要藉助於kibana工具來進行開發!
kibana
本篇不講kibana和es的安裝,後面會專門寫安裝過程。這裏先知道kibana工具是提供了一個可視化的界面。
我們的es需要以基於 HTTP 協議,以 JSON 爲數據交互格式的 RESTful API來進行交互!
Kibana 可以看出是一個操作 ElasticSeach 的客戶端.
由於Kibana是用nodejs寫的一個web項目。所以進程查詢使用ps來進行查詢區別es用jps查詢!
什麼是RESTful
一張圖演示什麼是restful
ES
ElasticSearch 交互方式
- 基於 HTTP 協議,以 JSON 爲數據交互格式的 RESTful API GET POST PUT DELETE HEAD
es與其他數據存儲產品比較
關於es幾個重要概念
概念 | 解釋 |
---|---|
cluster | 整個elasticsearch 默認就是集羣狀態,整個集羣是一份完整、互備的數據。 |
node | 集羣中的一個節點,一般只一個進程就是一個node |
shard | 分片,即使是一個節點中的數據也會通過 hash 算法,分成多個片存放,默認是 5 片。(7.0 默認是 1 片) |
index | 相當於EDBMS 的 database, 對於用戶來說是一個邏輯數據庫,雖然物理上會被分多個 shard 存放,也可能存放在多個 node 中。 |
type | 類似於 rdbms 的 table,但是與其說像 table,其實更像面向對象中的 class , 同一Json 的格式的數據集合。((6.x只允許建一個,7.0被廢棄,造成index實際相當於table級)) |
document | 類似於 rdbms 的 row、面向對象裏的object |
field | 相當於字段、屬性 |
小總結
- cluster 整個elasticsearch 默認就是集羣狀態
- 一個節點一個node
- 一個index可以類比成一個database!一個ndoe可以擁有多個index!
- 一個index(6.x)對應唯一的type,類比table!(5.x之前是對應多個type,7.x以後 type被捨棄!)
- shard爲其切片!在6.x默認是5片。7.x默認是1片
- document類比row
- field類比 column
- 注意:ES是自帶索引,且爲倒排索引!
可參考內容
Kibana上操作數據
插入數據
當沒有在type後面跟上id的話,那麼會自動生成一個uuid。id是不能重複的,這裏的id要區別於_source中自己定義的id!
注意:此id爲document的id!
覆蓋
沒有在put裏面聲明_update,這裏將自定義內容修改
修改
修改指定位置時,必須使用post請求!這裏區別於HTTP裏的PUT(create,update)請求!!
刪除
查詢
GET movie_index/_search
{
"query": {
"term": {
"id": {
"value": "2"
}
}
}
}
GET movie_index/_search
{
"query": {
"bool": {
"should": [
{"term": {
"actorList.name": {
"value": "zhang"
}
}},{
"term": {
"name": {
"value": "red"
}
}
}
]
}
}
}
GET movie_index/_search
{
"query": {
"bool": {
"must_not": [
{"term": {
"name": {
"value": "red"
}
}}
]
}
}
}
GET movie_index/_search
{
"query": {
"range": {
"doubanScore": {
"gt": 8
}
}
}
}
GET movie_index/_search
{
"query": {
"bool": {
"filter": {
"range": {
"doubanScore": {
"gte": 5,
"lte": 8
}
}
}
}
}
}
GET movie_index/_search
{
"from": 2
, "size": 1
}
GET movie_index/_search
{
"aggs": {
"a": {
"sum": {
"field": "doubanScore"
}
}
}
}
GET movie_index/_search
{
"aggs": {
" ": {
"terms": {
"field": "actorList.id",
"size": 10
}
}
}
}
GET movie_index/_search
{
"aggs": {
"a": {
"value_count": {
"field": "doubanScore"
}
}
}
}
GET movie_index/_search
{
"aggs": {
"b": {
"terms": {
"field": "actorList.name",
"size": 10
}
, "aggs": {
"sum": {
"sum": {
"field": "doubanScore"
}
}
}
}
}
}
PUT movie_index/_mapping/movie
{
"properties": {
"actorList.name": {
"type": "text",
"fielddata": true
}
}
}
GET movie_index/_search
{
"aggs": {
"group": {
"terms": {
"field": "actorList.id",
"size": 10
}
, "aggs": {
"maxScore": {
"max": {
"field": "doubanScore"
}
}
,
"minscore": {
"min": {
"field": "doubanScore"
}
}
}
}
}
}
GET movie_index/_search
{
"aggs": {
"group": {
"terms": {
"field": "actorList.id",
"size": 1
, "order": {
"_term": "desc"
}
}
}
}
}
GET zhengkw/_analyze
{
"analyzer": "ik_smart"
, "text": "第一節課"
}
GET zhengkw/_analyze
{
"analyzer": "ik_max_word"
, "text": "第一節課"
}
關於Mapping
之前說 type 可以理解爲table,那每個字段的數據類型是如何定義的呢?
- 默認情況下, 是由插入的第一條數據的類型來自動推斷來設定的!
- 可以通過 Mapping 來設置和查看每個字段的數據類型.
簡單類型中除了text會進行分詞,分詞後建立索引,其他簡單類型則不會分詞!但是也會建立索引!
也支持一些JSON對象,還有地圖類型的信息,比如地理位置的座標,或者地理位置的圖形!
關於使用
手動建立索引
PUT /movie_chn
{
"mappings": {
"movie":{
"properties": {
"id":{
"type": "long"
},
"name":{
"type": "text"
, "analyzer": "ik_smart"
},
"doubanScore":{
"type": "double"
},
"actorList":{
"properties": {
"id":{
"type":"long"
},
"name":{
"type":"keyword"
}
}
}
}
}
}
}
建立的時候 type指定爲movie document指定 id,name等 ,聲明用properties將doc括起來。properties後面的v並不是json數組!而是一個json字符串!指定text的name的時候也聲明分詞器!
插入數據
PUT /movie_chn/movie/1
{ "id":1,
"name":"紅海行動",
"doubanScore":8.5,
"actorList":[
{"id":1,"name":"張譯"},
{"id":2,"name":"海清"},
{"id":3,"name":"張涵予"}
]
}
PUT /movie_chn/movie/2
{
"id":2,
"name":"湄公河行動",
"doubanScore":8.0,
"actorList":[
{"id":3,"name":"張涵予"}
]
}
PUT /movie_chn/movie/3
{
"id":3,
"name":"紅海事件",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"張晨"}
]
}
查詢
GET /movie_chn/movie/_search
{
"query": {
"match": {
"name": "紅海"
}
}
}
GET /movie_chn/movie/_search
{
"query": {
"term": {
"actorList.name": "張"
}
}
}
注意事項(不斷更新ing)
1.創建index的時候可以包含空格!但是不能包含大寫字母!只能小寫字母!