วิธีเขียนโปรแกรมหา Term ที่มากที่สุดใน Lucene index

mantle-lucene

ลูซีน (Lucene) คือโอเพ่นซอร์สไลบรารี่ (open source library) ที่ใช้ในการเก็บข้อมูลเพื่อใช้ในการค้นหาซึ่งอยู่เบื้องหลังซอฟต์แวร์ Search Engine เช่น Elasticsearch และ Solr ภาษาหลักที่ใช้คือจาวา (Java) แต่ก็มีการพอร์ต (port) ไปยังภาษาอื่นๆด้วย เช่น ไพธอน (Python) หรือ C++

เมื่อจัดเก็บข้อมูลในอินเด็กซ์ (index) บางครั้ง อาจจะต้องการวิเคราะห์ข้อมูลว่ามีคำค้นหา (search term) อยู่มากน้อยแค่ไหน เพื่อนำไปต่อยอดในการประมวลผลด้านอื่นๆต่อไป

วิธีการเขียนโปรแกรมเพื่อหาจำนวนครั้งที่ปรากฏสำหรับแต่ละคำค้นหา:

  1. เปิด index ด้วยคำสั่ง reader = DirectoryReader.open()
  2. เรียก Term ทั้งหมดขึ้นมา ด้วยคำสั่ง terms = MultiFields.getTerms(reader, <ชื่อฟีลด์ที่ต้องการ>)
  3. เรียกข้อมูลผ่าน TermsEnum enum = terms.iterator(null)
  4. วนลูป enum ผ่านคำสั่ง enum.next() โดยที่ในแต่ละครั้ง จะได้คำนั้นๆ ถ้าข้อมูลเป็นภาษาอื่นที่ไม่ใช่ภาษาอังกฤษและเก็บแบบ utf-8 ให้เรียกคำสั่ง .utf8ToString() เพื่อถอดรหัส (decode) ส่วนจำนวนครั้งที่ปรากฏใน index  ใช้คำสั่ง enum.docFreq()
  5. เรียงลำดับ docFreq ตามต้องการ

วิธีการข้างต้น มาจากซอร์สโค้ดของ ลูค (Luke) ซึ่งเป็นทูล (tool) ที่ใช้ในการวิเคราะห์ข้อมูลที่ใช้ลูซีน ทั้งการวิเคราะห์คำค้นหา ทดสอบการตัดคำ หรือประมวลผลคำสั่งสืบค้นข้อมูล (query parser) เนื่องจากลูคเป็นโปรเจคโอเพ่นซอร์ส จึงสามารถเข้าไปดูเพื่อเป็นแนวทางในการเขียนคำสั่งด้วยลูซีนได้ แต่ตัวทูลก็มีประสิทธิภาพเพียงพออยู่แล้ว ถ้าไม่ได้ต้องการนำผลการวิเคราะห์ไปใช้ต่อในโค้ดโดยตรง

Luke github: https://github.com/DmitryKey/luke

สแลช (SLASH)

Advertisements