Elasticsearch ?

  • Distributed & Scalable
  • Highly Availability การการะจายตัวสำรองข้อมูลอัตโนมัติ
  • Horizontally scalable search engine
  • Document Oriented (มีการจัดเก็บในรูปแบบของ Json format) หรือ Haml format ก็สามารถทำได้
  • รองรับการทำงานในรูปแบบของ RESTful API (GET,PUT,POST,DELETE)
  • Real time search and analytics data
  • Full Text Search Engine
  • Handle Structured data
  • Aggregate Data ได้รวดเร็ว
  • ที่สำคัญที่สุดคือเป็น Open sources

Elasticsearch vs Relational Database

Indexing, Retrieving and Deleting Documents

ตัวอย่างการใช้งาน ทำระบบ ร้านอาหาร

INDEX (DATABASE ใน RDBMS) :: food_store

TYPE (TABLE ใน RDBMS) :: food

FIELD (COLUMN ใน RDBMS) :: {“name”: “value”,”price” : value , “stock” : value}

เปิด Dev Tool ขึ้นมาครับ http://localhost:5601/app/dev_tools#/console

1. เราจะ Indexing ข้อมูลลง Elasticsearch (Document are immutable นะครับ _version จะเพิ่มขึ้นทีละ 1)

PUT food_store/food/1
{
“name” : “Hamberger”,
“price” : 120,
“stock” : 100
}

PUT food_store/food/2
{
“name” : “Fried Eggs”,
“price” : 30,
“stock” : 200
}

PUT food_store/food/3
{
“name” : “Fried Rice”,
“price” : 60,
“stock” : 150
}

PUT food_store/food/4
{
“name” : “Pepsi”,
“price” : 20,
“stock” : 500
}

PUT food_store/food/5
{
“name” : “Coke”,
“price” : 20,
“stock” : 250
}

เราสามารถ update เฉพาะบาง field ได้เช่น

เราก็จะได้ข้อมูลเป็น

2. Retrieving / Search

GET food_store/food/2
หรือ
GET food_store/_doc/2

ซึ่งได้ผลลัพธ์ ดังนี้

{
"_index" : "food_store",
"_type" : "food",
"_id" : "2",
"_version" : 2,
"_seq_no" : 15,
"_primary_term" : 2,
"found" : true,
"_source" : {
"name" : "Fried Eggs",
"price" : 30,
"stock" : 200
}
}

ถ้าเรา ค้นหาตัวที่เรายังไม่ได้ indexing จะเป็นแบบนี้

ต่อไปเราจะค้นหา ทุก field ที่มีคำว่า “Pepsi”

GET food_store/food/_search?q=Pepsi

ต่อไปเราจะค้นหาดูว่ามีอะไรบ้างที่ราคา 20 บาท

GET food_store/food/_search
{
"query": {
"match": {
"price": 20
}
}
}

ต่อไป เราจะค้นหา ชื่อ = “Pepsi” และมี stock >300

GET food_store/food/_search
{
"query": {
"bool": {
"must": {
"match": {
"name": "Pepsi"
}
},
"filter": {
"range": {
"stock": {
"gte": 30
}
}
}
}
}
}

สำหรับวิธี search มีอีกล้านแปดวิธี ไปหาอ่านกันได้นะครับ

เช่น

GET food_store/food/_search
{
"query": {
"bool": {
"must": {
"match": {
"name": "Pepsi"
}
},
"filter": [
{
"range": {
"price": {
"lt": 21
}
}
}
]
}
}
}

GET food_store


GET food_store/_search
{
"query": {
"term": {
"name.keyword": "Co*"
}
}
}


GET food_store/_search
{
"query": {
"bool": {
"must": [
{"wildcard": {
"name": "Cok*"
}},
{
"term": {
"price": {
"value": "20"
}
}
}
]
}
}
}

GET food_store/_search
{
"query": {
"bool": {
"should": [
{"wildcard": {
"name": "Cok*"
}},
{
"term": {
"price": {
"value": "20"
}
}
}
]
}
}
}

GET food_store/_search
{
"query": {
"bool": {
"should": [
{
"wildcard": {
"name": "Cok*"
}
}
],
"filter": [
{
"range": {
"price": {
"gte": 19
}
}
}
]
}
}
}

GET food_store/_mapping

3. Deleting

DELETE food_store/food/2

ลองค้นหาดูก็จะเจอ

สำหรับตอนที่สองนี้ก็ขอจบแค่นี้นะครับ

--

--

Chiwa Kantawong (Pea)
Chiwa Kantawong (Pea)

Written by Chiwa Kantawong (Pea)

Software Development Expert at Central Tech

No responses yet