iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0
Elastic Stack on Cloud

Elastic 30天自我修行系列 第 26

用 R 設定 ElasticSearch mapping

  • 分享至 

  • xImage
  •  

先回答一下自己昨天的問題,今天剛好亂試試出來了

昨天我設定 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 的程式碼一定更加易讀與容易維護;

總之,補班日下班後,等下終於可以好好休息一下啦 。

/images/emoticon/emoticon56.gif


上一篇
比 API Console 更好用的 Console (Kibana 選單下的Console)
下一篇
讀同組鐵人賽參賽者文章的心得筆記#1
系列文
Elastic 30天自我修行31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言