SolrのSpellCheckComponentを使って”もしかして検索”

Solrで、もしかして検索(英語だとDid you mean?ってヤツ)をやりたいなと思って調べていくと、
SpellCheckComponentっていうのを使うと実現出来るようです。
 
ということで、Solr本を眺めながら、自分のノートパソコンでチョロっとやってみることにしました。
#概要だけなので諸々端折ります…。ガッツリ知りたい気合い入った人は↓のWiki(英語)で…
http://wiki.apache.org/solr/SpellCheckComponent
 
 
■ solrconfig.xml
 
1.searchComponent
“SpellCheckComponent使うぜ”っていうのと”スキーマのどのフィールドが対象なのか”を指定します。

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
 <str name="queryAnalyzerFieldType">textSpell</str>
 <lst name="spellchecker">
   <str name="name">default</str>
   <str name="field">hoge_spell</str>
   <str name="spellcheckIndexDir">spellchecker</str>
 </lst>
</searchComponent>

 
2.requestHandler
スペルチェック叩く時のURLは”/spell”だよんっていうのと、
上記1.で定義したSpellCheckComponentを使うよんっていうのを定義します。
#ココはちょいちょいパラメーターありそすね。

<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy"> ★ URL ★
 <lst name="defaults">
  <str name="spellcheck.onlyMorePopular">false</str>
  <str name="spellcheck.extendedResults">false</str>
  <str name="spellcheck.count">1</str>
 </lst>

 <arr name="last-components">
  <str>spellcheck</str>
 </arr>
</requestHandler>

 
 
■ schema.xml
 
HTTPでどのURLで呼ぶとか、呼ばれた時にどういうコンポーネントが〜みたいのを
上記solrconfig.xmlで定義しましたが、その対象のフィールドについてschema.xmlで定義してあげます。
 
1.fieldTypeの定義
ココは検索対象フィールドと併せて各種フィルタの定義を入れるかどうか、、

<fieldType name="textSpell" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.JapaneseTokenizerFactory"/>
  </analyzer>
</fieldType>

 
2.fieldの定義
solrconfig.xmlで定義したフィールドにtypeは上記のtextSpellで定義します。

<field name="hoge_spell" type="textSpell" indexed="true" stored="true" multiValued="true"/>

 
3.copyFieldの定義
オリジナルのフィールドからスペルチェック用のフィールドに。

<copyField source="hoge" dest="hoge_spell"/>

 
 
■ 実際にデータを入れて検索してみます
 
1.リクエスト時のクエリ文字列
http://localhost:8080/solr/spell — requestHandlerでの定義
?indent=on&version=2.2&q=hoge%3A源義詰 — 源義経をタイポしたと過程して、、
&spellcheck.build=true&spellcheck=on — スペルチェック系のパラメータ
&fq=&start=0&rows=10&fl=*%2Cscore&qt=&wt=&debugQuery=on&explainOther=&hl.fl= — 諸々
#実際は1行です。
 
2.返ってきた結果

<lst name="spellcheck">
  <lst name="suggestions">
    <lst name="源義">
      <int name="numFound">1</int>
      <int name="startOffset">xx</int>
      <int name="endOffset">xx</int>
      <arr name="suggestion">
        <str>源義経</str>
      </arr>
    </lst>
  </lst>
</lst>

 
 

ってことで、動作は確認できたので、パラメーターがどんなのあるかってのをトレースして、
あーだこーだやってみる感じですかね。
#英語のWiki読むのめんどくちゃいなぁ…w
 

Apache Solr入門 ―オープンソース全文検索エンジン
関口 宏司 三部 靖夫 武田 光平 中野 猛 大谷 純
技術評論社
売り上げランキング: 24196

コメント

タイトルとURLをコピーしました