Java, Elasticsearch, Kibana and GraphQL Path 2
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
ลองค้นหาดูก็จะเจอ
สำหรับตอนที่สองนี้ก็ขอจบแค่นี้นะครับ