สวัสดีครับ
การทำงานของ KeywordMarkerFilterFactory คือจะดู tokens ที่ได้จาก filter หรือ tokenizer ตัวก่อนหน้า มาพิจารณาว่ามี token ไหนบ้างที่ตรงกันกับคำที่อยู่ใน protwords.txt เมื่อพบแล้วจะเพิ่ม attribute ชื่อ keyword ให้มีค่าเป็น true ให้กับ token นั้นๆเพื่อเป็นการบอกให้ filter ที่อยู่ถัดไปรู้ว่าอย่านำ token เหล่านี้ไปแก้ไขหรือเปลี่ยนรูป เช่นการทำ stemming ครับ
จากตัวอย่างของคุณราชันย์
เนื่องจาก ICUTokenizer ตัดข้อความ "ของขวัญและของที่ระลึก" ออกเป็น 6 tokens ได้แก่ "ของ" "ขวัญ" "และ" "ของ" "ที่" "ระลึก"
ดังนั้น KeywordMarkerFilter จึงไม่พบ token เดี่ยวๆที่เขียนว่า "ของที่ระลึก" ครับ
ถ้าหากต้องการให้ Solr รวมคำว่า "ของ" "ที่" "ระลึก" เป็น token เดียว จะต้องใช้ CombiningFilter ครับ
[LUCENE-3413]แต่เนื่องจากคลาสนี้ยังไม่ได้รับการรวมเข้าไปในโค้ดหลักของ Solr ดังนั้นจำเป็นจะต้องนำไปคอมไพล์เป็นไฟล์ JAR แล้วนำไปใช้งานในลักษณะของ plugin นะครับ
ผมเข้าใจว่าคุณราชันย์ต้องการให้ผลการค้นหาแม่นยำขึ้นใช่หรือไม่ครับ?
หากคำค้นหาของเรามีลักษณะเป็น phrase หรือกลุ่มคำ ผมแนะนำว่าอาจจะลองปรับวิธีการค้นหาไปใช้
ExtendedDisMax ซึ่งรองรับการทำ phrase search ได้แทนครับ
การค้นหาแบบนี้ เราจะไม่ต้องกังวลว่าข้อความของเราถูกตัดคำเป็น "ของที่ระลึก" หรือไม่ เราตัดคำเป็น "ของ" "ที่" "ระลึก" เก็บไว้ตอนทำ indexing ได้เลยครับ
ตอนเราค้นหา Solr จะให้น้ำหนักคะแนนไปกับเอกสารที่มีคำสามคำนี้เขียนติดกันมากกว่าเขียนแยกกันครับ
ไพโรจน์