Posted at

Groongaを使ったゆるい検索

More than 3 years have passed since last update.

表記揺れや間違ったキーワードでも検索にヒットさせたい、というニーズを実現するためのアプローチ方法について学びました。


アプローチの分類


  1. 間違っていてもヒットさせてあげる


    1. データで頑張る

    2. 検索時に頑張る



  2. そもそも間違わないようにしてあげる


間違っていてもヒットさせてあげる


データで頑張る編

間違うであろう内容を先回りして登録していく手法


  1. 検索ログから間違いの傾向を検出して登録していくとか。


    • typoとかに対応しやすい

    • Groongaのログから検出するツールがある。



  2. 某pediaのredirectページを集めて登録するとか。


    • 略称や別名は対応しやすい



  3. 元データを登録時に形態素解析してありうる読みを全部登録していくとか。


    • 読み間違えとかに対応しやすい




検索時に頑張る編

検索時にGroongaの力でヒットさせる手法


  1. 数文字の間違いは誤差として検索できる(fuzzy_search機能)


    • fuzzy_search機能を使うと、数文字の誤差を無視してヒットさせる事ができる。

    • mroongaでの使い方


      • MATCH AGAINST句のクエリを*SSで始めるとgroongaのコマンドを書ける。そこでfuzzy_searchコマンドを使えるようになる。


        • SSはScript Syntaxの略。参考







  2. 類似した文章を検索できる(類似文書検索)


    • 類似文書検索をすると、完全に一致していなくてもヒットさせる事ができる。

    • mroonga


      • MATCH AGAINST句を IN BOOLEAN MODEではなく IN NATURAL LANGUAGE MODEにすると類似文書検索になる。


        • 実はデフォルト値なので、 IN BOOLEAN MODEを削除するだけでもOK。





    • 固有名詞を検索させたい場合は、MecabトークンよりBigramを使うといいかも(要検証)


      • 類似検索は一部のトークンが一致してればOKという機能なので、小さいトークンにすると一致する確率があがる。


        • ノイズが多くなるけど。








そもそも間違わないようにしてあげる


  • 時間切れにつき、またの機会に。


まとめ


  • 「間違っていてもヒットさせてあげる」においては、検索時よりはデータ収集に力を入れたほうが効果が高そう。

  • 「そもそも間違わないようにしてあげる」に力を入れるのがお勧めという説があったので、要勉強。