วิธีการ config Solr ให้ใช้ตัวตัดคำของ ICU Tokenizer

1,335 views
Skip to first unread message

Pairote Leelaphattarakij

unread,
Jul 7, 2014, 12:52:38 AM7/7/14
to solr-user...@googlegroups.com
ถึงแม้ว่า Apache Solr เองนั้นรองรับการตัดคำภาษาไทยอยู่แล้วผ่านทาง component สามตัวคือ
- ThaiAnalyzer
- ThaiWordFilter
- ThaiTokenizer

แต่สำหรับผู้ใช้ที่ต้องการใช้ตัวตัดคำของ ICU ซึ่งมีข้อดีกว่าคือ
- รองรับการตัดคำหลายภาษาใน component เดียว (เช่นภาษาอังกฤษ จีน ญี่ปุ่น)
- ตัดคำภาษาไทยได้แม่นยำกว่า
- ไม่มีปัญหาเรื่องนำไปใช้งานได้ไม่ทุก JRE เหมือนที่ component ทั้งสามตัวด้านบนมี

โดยสำหรับคนที่เพิ่งเริ่มต้นอาจจะไม่รู้ว่าจะ config ยังไง ผมเลยอยากเขียนสรุปไว้ให้ดังนี้ครับ

ใน release package ที่เรา download มาจะมีไฟล์ .jar อยู่ในโฟลเดอร์ชื่อ solr/contrib/analysis-extras/ ให้เรา copy ไฟล์ .jar ทุกอันไปไว้ที่ SOLR_HOME/lib ของเราครับ

จากนั้นในไฟล์ schema.xml ของ collection1 (อยู่ในโฟลเดอร์ example\solr\collection1\conf) จะมีประกาศ fieldType ชื่อ text_th เตรียมไว้ให้แล้วแบบนี้ครับ

<!-- Thai -->
<fieldType name="text_th" class="solr.TextField" positionIncrementGap="100">
  <analyzer> 
    <tokenizer class="solr.ThaiTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_th.txt" />
  </analyzer>

</fieldType>


ให้เปลี่ยนเป็นแบบนี้ครับ

<fieldType name="text_th" class="solr.TextField" positionIncrementGap="100">
  <analyzer> 
    <tokenizer class="solr.ICUTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_th.txt/>
  </analyzer>

</fieldType>


เสร็จแล้วค่อย restart Solr แล้วเพิ่มข้อมูลเข้าไปใหม่เพื่อ reindex ข้อมูลครับ

สำหรับคนที่ไม่ได้ไปงาน SolrMaster Class ที่ผ่านมา อันนี้เป็น link สไลด์ของผมที่พูดเกี่ยวกับเรื่องนี้ด้วย ลองดูนะครับ  Configuring Apache Solr For Thai Text Search

ไพโรจน์


Bczoffyou Chun

unread,
Jul 9, 2014, 12:51:02 AM7/9/14
to solr-user...@googlegroups.com
สวัสดีครับ
ตอนนี้ผมใช้ Solr 4.8.1  รันบน  Jetty ซึ่งใน Schema.xml ของผม config ไว้แบบนี้ครับ

<fieldType name="text_th" class="solr.TextField" positionIncrementGap="100">
      <analyzer> 
        <tokenizer class="solr.ThaiTokenizerFactory"/>  
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_th.txt"/>  
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>  
        <filter class="solr.LowerCaseFilterFactory"/> 
        <filter class="solr.ThaiWordFilterFactory"/>
        <filter class="solr.EnglishMinimalStemFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>          
      </analyzer>

ผมมีปัญหาเรื่องของการ search คำว่า นาฬิกาคิตตี้  ซึ่งตัว analyzer จะตัดคำให้ไม่ได้ จริง ๆ แล้วมันควรแยกเป็น นาฬิกา ​+ คิตตี้  แต่มันกลับไม่สามารถตัดให้ได้เลย 
ส่งผลให้เวลาค้นคำว่า คิตตี้ จะไม่มีสินค้าที่ชื่อ  นาฬิกาคิตตี้ ขึ้นมาเลย ควรแก้ไขยังไงดีครับ
 
ราชันย์

Pairote Leelaphattarakij

unread,
Jul 9, 2014, 11:52:22 PM7/9/14
to solr-user...@googlegroups.com
ถ้าเปลี่ยนไปใช้ ICUTokenizer จะพอตัดคำได้นะครับ  ดูในรูปด้านล่างนะครับ

text_th

"นาฬิกาคิตตี้" > "นาฬิกาคิตตี้"

text_th_icu

"นาฬิกาคิตตี้" > "นาฬิกา" "คิต" "ตี้"

text_th_inspica

"นาฬิกาคิตตี้" > "นาฬิกา" "คิตตี้"


ด้านล่างนี้เป็น fieldType ที่ผมใช้ในการทดสอบครับ

<fieldType name="text_th" class="solr.TextField" positionIncrementGap="100">
  <analyzer> 
    <tokenizer class="solr.ThaiTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>

    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_th.txt/>
  </analyzer>
</fieldType>

<fieldType name="text_th_icu" class="solr.TextField" positionIncrementGap="100">

  <analyzer> 
    <tokenizer class="solr.ICUTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_th.txt/>
  </analyzer>
</fieldType>

<fieldType name="text_th_inspica" class="solr.TextField" positionIncrementGap="100">
  <analyzer> 
    <tokenizer class="com.inspica.solr.analysis.th.ThaiTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_th.txt/>
  </analyzer>
</fieldType>

ส่วนใน solrconfig.xml ของ collection1 ในโฟลเดอร์ example ที่มากับ package ของ Solr ผม เพิ่มสามบรรทัดนี้เข้าไปเพื่อให้ solr ไป load ไฟล์ library ของ ICU มาใช้ครับ

<lib dir="../../../contrib/analysis-extras/lib/" regex=".*\.jar">
<lib dir="../../../contrib/analysis-extras/lucene-libs/" regex=".*\.jar">
<lib dir="../../../dist/" regex="solr-analysis-extra-\d.*\.jar">

ลองดูนะครับ

ไพโรจน์

Bczoffyou Chun

unread,
Jul 10, 2014, 3:16:29 AM7/10/14
to solr-user...@googlegroups.com
ขอบคุณมากเลยคัฟคุณไพโรจน์
ผมลองเอา text_th_icu ไปใช้สามารถตัดคำได้ดีกว่าจริง ๆ ด้วย

แต่ผมเจอปัญหาตรงนี้นิดนึงครับ ตอนที่เอา สามบรรทัด (ในส่วนของการนำ Lib  ) มาใช้ 
<lib dir="../../../contrib/analysis-extras/lib/" regex=".*\.jar">
<lib dir="../../../contrib/analysis-extras/lucene-libs/" regex=".*\.jar">
<lib dir="../../../dist/" regex="solr-analysis-extra-\d.*\.jar">

เกิด Error นี้ขึ้น 

2044 [coreLoadExecutor-4-thread-1] ERROR org.apache.solr.core.Config  – Exception during parsing file: solrconfig.xml:org.xml.sax.SAXParseException; systemId: solrres:/solrconfig.xml; lineNumber: 1852; columnNumber: 3; The element type "lib" must be terminated by the matching end-tag "</lib>".


ผมเลยเพิ่ม / เข้าไปก่อนปิด tag lib
<lib dir="../../../contrib/analysis-extras/lib/" regex=".*\.jar" />
<lib dir="../../../contrib/analysis-extras/lucene-libs/" regex=".*\.jar" />
<lib dir="../../../dist/" regex="solr-analysis-extra-\d.*\.jar" />

ก็กลับมา start ได้ปกติ แจ้งไว้เผื่อใครเจอปัญหาเหมือนผม

ขอบคุณมากครับ
ราชันย์
<<span style="font-size:small;letter-spacing:0p
...

Pairote Leelaphattarakij

unread,
Jul 10, 2014, 5:00:27 AM7/10/14
to solr-user...@googlegroups.com
อ้อ ขอโทษทีครับ ผมลืมปิด tag ให้

ยินดีด้วยนะครับที่แก้ปัญหาได้

ไพโรจน์
    <<span style="font-size:small;line-height:18px;font-fam
...

iam...@gmail.com

unread,
Dec 23, 2015, 10:59:21 PM12/23/15
to solr-user-thailand
ไม่ทราบว่า จะหา stopwords_th.txt ได้จากที่ไหนคับ?

เมื่อ วันจันทร์ที่ 7 กรกฎาคม ค.ศ. 2014 11 นาฬิกา 52 นาที 38 วินาที UTC+7, Pairote Leelaphattarakij เขียนว่า:

Pairote Leelaphattarakij

unread,
Dec 23, 2015, 11:40:45 PM12/23/15
to solr-user-thailand
ไฟล์ stopwords_th.txt มีมากับ solr อยู่แล้วครับ เช่นใน collection1 ไฟล์ stopwords_th.txt จะเก็บอยู่ที่ example/solr/collection1/conf/lang/stopwords_th.txt ครับ

iam...@gmail.com

unread,
Dec 24, 2015, 2:52:19 AM12/24/15
to solr-user-thailand
^___________^ ของคุณมากๆคับ

เมื่อ วันพฤหัสบดีที่ 24 ธันวาคม ค.ศ. 2015 11 นาฬิกา 40 นาที 45 วินาที UTC+7, Pairote Leelaphattarakij เขียนว่า:

iamCJ Kung

unread,
Jan 7, 2016, 4:43:52 AM1/7/16
to solr-user-thailand

รบกวนสอบถามเพิ่มเติมคับ

ตอนนี้ text_th สามารถตัดคำภาษาไทยได้แล้ว


แต่ใน schema.xml ตรง <defaultSearchField>search_text</defaultSearchField> ซึ่งพอเวลาเปิด solr มาเพื่อ analysis ดู จะไม่สามารถตัดคำได้ (ตามภาพ)


คำถามคือ ทำอย่างไรให้ search_text สามารถตัดคำได้ หรือ กำหนด <defaultSearchField> ให้เป็น text_th ได้บ้างคับ?? เพราะในหน้าเว็บจริง ยังไม่สามารถ search แบบตัดคำไทยได้ เดาว่า defaultsearchfield น่าจะเป็นตัว search_text อยู่คับ

Bczoffyou Chun

unread,
Feb 19, 2016, 2:27:30 AM2/19/16
to solr-user-thailand
ในไฟล์ solrconfig.xml ลองไปดูว่าใน secttion ของ RequestHandler ค่า  df (default field) เราเซ็ต ไว้เป็น fieldtype อะไร 
ยกตัวอย่างเช่น
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int> <str name="df">text</str>
</lst>
</requestHandler>

เราก็ใช้วิธี copyField field ที่เราต้องการ query ไปยัง fieldtype นั้น ๆ 
ในกรณ๊ของผมก็ต้องทำแบบนี้ครับ
<copyField source="product_*" dest="text"/>

หวังว่าจะจะช่วยได้นะครับ
ราชันย์

Anucha Buatum

unread,
Dec 27, 2019, 3:52:51 AM12/27/19
to solr-user-thailand


เมื่อ วันจันทร์ที่ 7 กรกฎาคม ค.ศ. 2014 11 นาฬิกา 52 นาที 38 วินาที UTC+7, Pairote Leelaphattarakij เขียนว่า:
ถึงแม้ว่า Apache Solr เองนั้นรองรับการตัดคำภาษาไทยอยู่แล้วผ่านทาง component สามตัวคือ

Anucha Buatum

unread,
Dec 27, 2019, 3:55:46 AM12/27/19
to solr-user-thailand
สอบถามหน่อยครับว่าพวก package solr.ICUTokenizerFactory มีติดมากับ solr เลยหรือต้องไปหา package มาลองเองอีกทีครับ

เมื่อ วันจันทร์ที่ 7 กรกฎาคม ค.ศ. 2014 11 นาฬิกา 52 นาที 38 วินาที UTC+7, Pairote Leelaphattarakij เขียนว่า:
ถึงแม้ว่า Apache Solr เองนั้นรองรับการตัดคำภาษาไทยอยู่แล้วผ่านทาง component สามตัวคือ
Reply all
Reply to author
Forward
0 new messages