2015年4月12日日曜日

Mroonga導入してみた。mroonga_snippetがうまく動かない。

mroongaを入れてみた。
Railsで作っているディレクトリサービスサイトの検索機能をリニューアルしようと導入中。

使いはじめは簡単で、データを入れて FULLTEXTインデックスを張れば
すぐに全文検索できるようになった。

まだいつも間違ってしまうのが、例えば サイト名と、紹介テキストをそれぞれ、name,
descriptionカラムに持つテーブルがあるとして、FULLTEXTインデックスを(name, description)に対して張った場合、
SELECT時AGAINST句で両方のカラムを指定しなければいけないこと。

Googleでもそうだけど検索結果のテキストで該当部分を目出させるようにしたい。
mroonga_snippetを使うとそういうことができるのだろうけど、試してみるとwordNに日本語を指定したら

Can't initialize function 'mroonga_snippet'; Failed to add a condition to grn_snip: <>

とメッセージをだしてエラーになった。

まぁ実験的機能ということだしまだなのかな。しかし国産なのに日本語がだめとは。。。

ではどうするか。


Modelの方で、該当文字列をspanタグで囲って返す処理を作った。


def description_for_search_result keyword

desc = self.description.strip

first_pos = desc.index( keyword )
first_pos = 0 if first_pos.nil?
max_length = 200
prefix = "..."

if first_pos <= 5 start_pos = 0 elsif desc.length - first_pos < max_length start_pos = desc.length - max_length else start_pos = first_pos end start_pos = 0 if start_pos < 0 prefix = "" if start_pos == 0 postfix = "" if start_pos + max_length < desc.length postfix = "..." end text = self.description[ start_pos, max_length ] text = text.gsub(/(#{keyword})/, %!\\1!)

dum = start_pos + max_length
ret = %!#{prefix}#{text}#{postfix}!.html_safe

end


はじめに対象文字列があった場所から、200バイト分を出力。
抽出される文字列が200バイトより少なくなるようなら、開始位置を調整。
紹介分自体が200文字より短いなら全文を表示。
表示の前後で省略される部分があるなら「...」を表示。

該当箇所はで囲まれてでてくるので、
CSSで目立つようにしてやる。


まぁこれでいったんいいんだが、
mroongaの結果では「すぽーつ」で検索しても「スポーツ」を含む結果が
返されるが、この置き換えメソッドは強調できない。

カタカナ、ひらがな程度なら対応もできるが、自然言語検索した場合は
どうしようもない。検索結果毎に処理が走るのもできれば避けたいし、早くmroonga_snippetが
使えるようになったほしい。

0 件のコメント:

コメントを投稿