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
—
技術評論社
売り上げランキング: 24196
コメント