แนะนำหมวดหมู่ (Category suggestion) ด้วย Percolate Query ของ Elasticsearch

บทความนี้เราจะมาลองสร้าง category suggestion ด้วย percolate query ของ Elasticsearch กัน ก่อนอื่นต้องทำความเข้าใจกับ percolate query ก่อนว่ามันทำงานยังไงนะครับ ปกติแล้วเราจะเก็บข้อมูลของสินค้าหรือบทความของเราไว้ที่ Elasticsearch แล้วค้นหาสินค้าหรือบทความนั้นๆ ด้วยการสร้าง query ขึ้นมาจากคำค้นหาที่เราต้องการ

เช่น อยากหาบทความเกี่ยวกับ elasticsearch

{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  }
}

Elasticsearch ก็จะนำคำค้นหาของเราไปค้นดูว่ามี document ไหนบ้างที่มีคำว่า elasticsearch ใน title บ้าง

แต่วิธีการของ percolate query จะสลับกันก็คือ เราจะเก็บ query ที่เราต้องการไว้ใน Elasticsearch แล้วนำเนื้อหาหรือ title ของบทความใหม่ที่เราเขียนขึ้นไปค้นดูว่า ตรงกับ query ไหนที่เราเก็บไว้บ้าง

ซึ่งวิธีการเก็บก็ไม่ได้มีอะไรเพิ่มเติมมากนัก เราแค่ระบุชนิด (type) ของ field ที่เราต้องการเก็บ query ให้เป็น percolator ส่วน field อื่นๆ ก็เลือกให้เหมาะสมตามชนิดของข้อมูลและวัตถุประสงค์ที่เราเก็บ (อย่าลืมว่า Elasticsearch เลือก Analyzer ผิดชีวิตเปลี่ยน นะจ๊ะ ^^)

ตัวอย่างการกำหนด type ของ field เป็น percolator

PUT articles
{
  "mappings": {
    "doc": {
      "properties": {
        "query": {
          "type": "percolator"
        },
        "title": {
          "type": "text"
        },
        "category": {
          "type": "text"
        }
      }
    }
  }
}

สมมุติว่าเราอยากแนะนำหมวดหมู่ของบทความใหม่ด้วยการใช้ title ของบทความไปหาหมวดหมู่ที่เราเก็บไว้ใน Elasticsearch เราอาจจะเริ่มด้วย บทความที่มีคำว่า elasticsearch, query, search ให้อยู่ในหมวดหมู่ “Search Engine”

ตัวอย่าง document ที่ประกอบด้วยข้อมูลของ field (query) ที่มี type เป็น percolator

POST articles/doc/search_engine
{
  "query": {
    "match": {
      "title": "elasticsearch query search"
    }
  },
  "category": "Search Engine",
  "another_field": "Another field value"
}

จากนั้นก็ลองค้นด้วย title เช่น

GET articles/_search
{
  "query": {
    "percolate": {
      "field": "query",
      "document": {
        "title": "ทดลองสร้าง query สำหรับ search ใน elasticsearch"
      }
    }
  }
}

ผลลัพธ์ที่ได้น่าจะประมาณนี้ครับ

{
  "took" : 31,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "articles",
        "_type" : "doc",
        "_id" : "search_engine",
        "_score" : 0.8630463,
        "_source" : {
          "query" : {
            "match" : {
              "title" : "elasticsearch query search"
            }
          },
          "category" : "Search Engine",
          "another_field" : "Another field value"
        },
        "fields" : {
          "_percolator_document_slot" : [
            0
          ]
        }
      }
    ]
  }
}

สำหรับบทความนี้ก็เป็นตัวอย่างง่ายๆ พอให้เพื่อนๆ ได้เห็นภาพครับ แน่นอนว่าเราสามารถประยุกต์ใช้ percolate query ได้อีกมาก หวังว่าจะเป็นประโยชน์กับเพื่อนๆ ครับ

แหล่งข้อมูล: Percolate Query