嗯,我知道標題很爛,但讓我野人獻曝一下
在今天之前,我都是使用 ElasticSearch 網頁中的 API Console 中,來進行各種指令的測試:
今天才發現,使用 Kibana 選單底下 "Manage and Administer the Elastic Stack" 的 Console 更加好用:
畫面如下:
左側就想成是一般寫作 SQL 的編輯區,右側則是結果區域。
就像一般 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 相關的教學文件,否則我想我這陣子所寫的三國演義的蒐尋,優化的結果可能完全不符合我原先的預則。
也歡迎高手多提供教學文章的連結;或者說,應該多多請教其他鐵人賽參賽高手的高見!