先回答一下自己昨天的問題,今天剛好亂試試出來了
昨天我設定 mapping 的操作手順:
DELETE /books # 1-刪除 books index
PUT /books # 2-新建 books index
PUT /books/_mapping # 3-定義 books index 的 mapping(Schema)
{ 設定 mapping 指令... }
昨天我異常的 mapping 的操作手順:
DELETE /books # 1-刪除 books index
PUT /books # 2-新建 books index
PUT /books/ # 3-定義 books index 的 mapping(Schema) ??
{ 設定 mapping 指令... }
今天試出來的 mapping 操作手順
DELETE /books # 1-刪除 books index
PUT /books # B-等於 "新建 books index" + 定義 books index 的 mapping(Schema)
{ 設定 mapping 指令... }
真因是 新建 index 與 定義 Schema 其實是可以在同一個指令下就完成。當然也可以分開執行。但你不能新建好一個 index 後,又新建一個同名的 index。如果用關聯式資料庫的想法,就是在你在 MySQL 上面建立一個 sales 的 Table 後,再建一個同名的 sales 的 Table 當然會報錯!!! 所以提示訊息才會出現 "index [books] already exists"的字樣。
也是是說昨天的這個指令:
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
}
}
}
}
}
其實就類似底下的 SQL:
舊系統的關聯式資料庫不支援JSON格式,對於全文搜索的能力也偏弱;這就是我們使用 ElasticSearch 的動力。只是在關聯式資料庫中,新建 Table 時,一定會要求定義各欄位型別(Schema),但在 ElasticSearch 是可以分別操作的。
CREATE TABLE books (
author varchar(99),
cover_url varchar(99),
description varchar(99),
public_date date,
title varchar(99)
);
好啦,拉回到今天的正題。今天要做的事情,也很簡單,就是透過 R 的套件,把昨天做的事情再重新做一遍。
啊,就這樣簡單 ??? 真的。因為我沒其他新招了 不敢誤人子弟啊
library(elastic)
# Connect OK!
x <- connect(
host = "111.asia-east1.gcp.elastic-cloud.com",
path = "",
user = "elastic",
pwd = "111",
port = 9243,
transport_schema = "https"
)
# 等價於 DELETE /books
index_delete(
conn =x ,
index = "books"
)
# 等價於 PUT /books
index_create(
conn =x ,
index = "books"
)
# 等價於 PUT /books/_mapping { mapping 設定}
mapping_create(
conn = x ,
index = "books",
body = '{
"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 { 書籍資料 }
docs_create( conn = x, index='books', id = "1", body= ' {
"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 { 書籍資料 }
docs_create( conn = x, index='books', id = "2", body= ' {
"title":"Mastering ElasticSearch 5.0",
"description":"222 ",
"author":"333",
"public_date":"2017",
"cover_url":"222"
} '
)
# 等價於 GET books/_search
Search(
conn = x ,
index = "books" )
其中比較建議的作業方式,依然是直接先透過 Kibana 的 Console 進行測試。畢竟這樣易於排除是否因 R 套件所導致。如果一開始在不熟悉 Elastic 各種技術細節,直接操作 R elastic 套件,可能會導致學習時的混亂。而且在 Console 還有"提示字"的智慧功能,對於初學者會相對友善。
最後要提醒的是,R elastic套件中函數如果有 body 都支援 JSON 字串,只要把 Console 中確認好的語法貼到R再記得前後再加上單引號即可;
當然 body 也支援 list 格式,例如:
body <- list(
title = "Mastering ElasticSearch 5.0",
description = "222 ",
author = "333",
public_date = "2017",
cover_url = "222"
)
如果要匯入大量的文件,使用 list 的程式碼一定更加易讀與容易維護;
總之,補班日下班後,等下終於可以好好休息一下啦 。