AlfrescoをGoogleライクな検索に改良してみる

Alfrescoのキーワード検索は一見Googleライクなんだけど、微妙に違うところがあって思うように検索結果を絞り込めないという話が出てきました。Alfrescoのソースと睨めっこしていると改良できそうだったのでやってみました。

スペース区切りがOR検索になってしまう

Googleだと、単語をスペースで区切ることで検索結果を絞り込むことができます。ところがAlfrescoだと、デフォルトではOR検索になるみたいです。明確に下記のようにANDですよと伝えなきゃならない。

apple AND banana

または、プラス(+)でもOK。

+apple +banana

これは知らない人ははまるだろうなぁ。一般的にはANDな気がするけどなんでORなんだろ?
Alfrescoのフォーラムを漁ってみたけど同じように困っている人はなぜか見つからない。。。唯一、デフォルトがGoogleのようにANDだといいなという投稿が見つかったくらい。

で、デフォルトをANDにする方法ですが、一応切り替える仕組みは持っているようで、SearchParameters#setDefaultOperatorにANDを渡せば良い。ただ、これをANDにするだけだとまったく検索が引っかからなくなってしまう。内部で生成されるクエリの違いを調べていると、webscriptsのsearch.lib.jsでクエリ文字列を組み立てているのだが、そこで一部スペース区切りになっているところがあった。これまでORだったものが、デフォルトをANDにするとここもANDになってしまうので、結果全く引っかからなくなってしまっていたようだ。

というわけで、明示的にsearch.lib.jsにORを書いてやることで解決。作ったパッチはJIRAにも投稿しておきました。

http://issues.alfresco.com/jira/browse/ALF-6349

全角スペースが区切り文字としては認識されない

こちらもGoogleだと空気読んで全角スペースで区切って検索してくれるのですが、Alfrescoだと駄目。

全角スペースはLucene2.9で対応という話もあるのですが、Alfrescoで使われているLuceneは2.4.1と古い。試しに2.9にするとAPIが変わってて起動すらせず…

これは対応無理かなぁと思っていたけれども、Alfrescoのソースを見ると独自に検索文字列をANTLRでパースしている処理があり、そこで区切り文字列として全角スペース(\u3000)を追加するだけで対応可能でした。調べる時間は結構かかりましたが、修正自体は1行(とANTLRでクラスを再生成)。こちらも作成したパッチをJIRAに投稿しておきました。

http://issues.alfresco.com/jira/browse/ALF-6350


これでちょっとはGoogleライクに検索できるようになるかな。後はハイライト機能があればいいんですが、これはかなり対応が難しそうです。