สอบถามเรื่อง protwords.txt

47 views
Skip to first unread message

Bczoffyou Chun

unread,
Nov 10, 2014, 4:08:22 AM11/10/14
to solr-user...@googlegroups.com
ขอสอบถามครับ
ผมต้องการที่จะใช้  filter : solr.KeywordMarkerFilterFactory เพื่อไม่ให้ analyzer ทำการตัดคำบางคำที่ผมระบุไว้ใน protword.txt 
ผมได้ทำการ set schema ดังนี้ 

  <fieldType name="text_th_kw" class="solr.TextField" positionIncrementGap="100">
      <analyzer> 
        <tokenizer class="solr.ICUTokenizerFactory"/> 
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.LowerCaseFilterFactory" />    
        <filter class="solr.StopFilterFactory" ignoreCase="false" words="lang/stopwords_th.txt" />     
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
      </analyzer> 
    </fieldType>

และใน protword.txt ผมได้เพิ่มคำว่า 
ของขวัญ
ของที่ระลึก 
เข้าไปแล้วลองใช้ admin/analsis โดยลองป้อนข้อความดังนี้  ของขวัญและของที่ระลึก
Result ที่ได้ดังรูปครับ

ซึ่งดูเหมือนว่า คำที่ผมระบุไว้ใน protwords.txt ยังถูกตัดแยกคำอยู่ดี  
ไม่ทราบว่า ผม set schema ผิดตรงไหนครับ

ขอบคุณมากครับ
ราชันย์

Pairote Leelaphattarakij

unread,
Nov 13, 2014, 2:50:42 AM11/13/14
to solr-user...@googlegroups.com
สวัสดีครับ

การทำงานของ 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 จะให้น้ำหนักคะแนนไปกับเอกสารที่มีคำสามคำนี้เขียนติดกันมากกว่าเขียนแยกกันครับ

ไพโรจน์

Bczoffyou Chun

unread,
Nov 13, 2014, 10:28:53 PM11/13/14
to solr-user...@googlegroups.com
ขอบคุณมาก ๆ เลยครับคุณไพโรจน์ สำหรับความรู้ และคำแนะนำ ตอนนี้ผมพอจะเข้าใจการทำงานของ  Analyzer และ tokenizer รวมถึงตัว filter มากขึ้น
เดี๋ยวผมจะลองศึกษาเรื่อง EDisMax เพิ่มเติม หากมีคำถามอะไรเพิ่มเติมจะมารบกวนสอบถามใหม่นะครับ

ขอบคุณมาก ๆ ครับ
ราชันย์
Reply all
Reply to author
Forward
0 new messages