iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 25
0
Elastic Stack on Cloud

Elastic 30天自我修行系列 第 25

比 API Console 更好用的 Console (Kibana 選單下的Console)

嗯,我知道標題很爛,但讓我野人獻曝一下 /images/emoticon/emoticon06.gif

在今天之前,我都是使用 ElasticSearch 網頁中的 API Console 中,來進行各種指令的測試:

https://ithelp.ithome.com.tw/upload/images/20200925/20130033cJ4o991WUz.png

今天才發現,使用 Kibana 選單底下 "Manage and Administer the Elastic Stack" 的 Console 更加好用:

https://ithelp.ithome.com.tw/upload/images/20200925/201300332YvnMligfw.png

畫面如下:
左側就想成是一般寫作 SQL 的編輯區,右側則是結果區域。

https://ithelp.ithome.com.tw/upload/images/20200925/20130033jH17cJl49M.png

就像一般 SQL 開發工具,各位平常是怎樣寫 SQL 的?
大概是類似這樣吧↓
不會一次只寫一個查詢,在開發階段,一定是寫很多個,然後針對需要查詢的部分圈選起來,然後選擇執行。就像下例中,如果我只要執行第2個查詢,我只需要圈選第2段 SQL,而不用全部圈選起來;或是我想要查詢前面3個 SQL,我就圈選前3例,一次執行3組SQL,大部分的 SQL 開發工具,就會同時回傳3種結果給你

select * from sales where total_sales > 50000;
select * from sales where usename = 'testaaa' ;
select * from number where sat_score > 30 and sat_score < 75 ;
select studentID, FullName, sat_score, recordUpdated
    from student
    where (
		studentID between 1 and 5
		or studentID = 8
        or FullName like '%Maximo%'
		)
		and sat_score NOT in (1000, 1400);

同樣的,在 Dev Tools 中的 Console 也支援多個指令,所以我就可以直接下好幾個指令。
而不用像之前一樣笨笨的,一次一個指令一個一個慢慢下:

# Create the two indices
DELETE /my-index-000001
DELETE /my-index-000002

PUT /my-index-000001
PUT /my-index-000002

# Update both mappings
PUT /my-index-000001,my-index-000002/_mapping
{
  "properties": {
    "user": {
      "properties": {
        "name": {
          "type": "keyword"
        }
      }
    }
  }
}

然後我昨天看了 爲何有人說ES很難學?因爲他本身就反人類呀!這東西到底可以幹嘛(2)Elastic"Search"這件事 的文章。我之前認為 mapping 不是很重要,畢竟這東西在觀念不是近似於關聯式資料庫的 Schema? 那都說好了是 NoSQL,這東西應該只是備而不用吧? 結果被打臉了...

然後我就照上文中的做法進行操作,結果怎麼試都不行,後來再同時參照官網上的說明

發現把程式碼調成如下,就可以正確執行

DELETE /books 

PUT /books

PUT /books/_mapping
{
      
      "properties" : {
        "author" : {"type" : "keyword"}, 
        "cover_url" : {"type" : "keyword","index": false}, 
        "description" : {"type" : "text"}, 
        "public_date" : {"type" : "date"}, 
        "title" : {
          "type" : "text", 
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 100
            }
          }
        }
      }
   

}

PUT books/_doc/1
{
  "title":"Mastering ElasticSearch 5.0",
  "description":"Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ ",
  "author":"Bharvi Dixit",
  "public_date":"2017",
  "cover_url":"https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}

PUT books/_doc/2
{
  "title":"Mastering ElasticSearch 5.0",
  "description":"Master1111 ",
  "author":"Bharvi assa",
  "public_date":"2019",
  "cover_url":"https://images-nL.jpg"
}

GET books/_search

主要是針對 books 這個 Index:
刪除 → 新建 → 建立 mapping → 放上第1資料 → 放上第2筆資料 → 查詢

我主要的困難點是,在建立 mapping 的過程中,如果我使用如下的語法就會失敗.
一定要透過 PUT /books/_mapping 才能順利執行成功....
若使用 PUT /books 然後將 mapping 抱在 JSON 中就一定失敗

PUT /books
{
      "mappings" : {
      "properties" : {
        "author" : {"type" : "keyword"}, 
        "cover_url" : {"type" : "keyword","index": false}, 
        "public_date" : {"type" : "date"}, 
        "title" : {
          "type" : "text", 
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 100
            }
          }
        }
      }
    }
}

會顯示出如下的錯誤訊息:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "resource_already_exists_exception",
        "reason" : "index [books/809_EmVASNKlPM4ITL-19A] already exists",
        "index_uuid" : "809_EmVASNKlPM4ITL-19A",
        "index" : "books"
      }
    ],
    "type" : "resource_already_exists_exception",
    "reason" : "index [books/809_EmVASNKlPM4ITL-19A] already exists",
    "index_uuid" : "809_EmVASNKlPM4ITL-19A",
    "index" : "books"
  },
  "status" : 400
}

我想我應該要再多花點時間觀察 mapping 相關的教學文件,否則我想我這陣子所寫的三國演義的蒐尋,優化的結果可能完全不符合我原先的預則。
也歡迎高手多提供教學文章的連結;或者說,應該多多請教其他鐵人賽參賽高手的高見!


上一篇
上傳三國演義人名詞庫到 Elastic Co
下一篇
用 R 設定 ElasticSearch mapping
系列文
Elastic 30天自我修行31

尚未有邦友留言

立即登入留言