Kuromoji_readingform を使用して読み仮名でサジェストを得たい

お世話になっております。

「貴社の記者が汽車で帰社する」というドキュメントに対して、漢字、読み仮名でサジェストを得たいのですが、うまくいかず相談させていただきました。

indexは以下のようになっております。

PUT kaiba
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "tag_analyzer": {
            "type": "custom",
            "tokenizer": "kuromoji_tokenizer",
            "filter": [
              "kuromoji_readingform",
              "lowercase"
            ],
            "mode": "search"
          }
        }
      }
    }
  },
  "mappings": {
    "tags": {
      "properties": {
        "name_completion": {
          "type": "completion",
          "analyzer": "tag_analyzer"
        }
      }
    }
  }
}

GET /kaiba/tags/_search
{
  "suggest": {
    "hoge": {
      "prefix": "貴社",
      "completion": {
        "field": "name_completion"
      }
    }
  }
}
  • 貴社 => OK
  • 貴社の記 => OK (こんな検索はしないでしょうが)
  • キシ => OK
  • キシャ => OK
  • キシャノ => OK
  • キシャノキ => NG
  • キシャノキシャ => NG

kuromoji_readingformを使用せず、自前で読み仮名を得て、standard tokenizerを使用したフィールドを入れればうまくいくのですが、できればkuromoji_readingformに寄せたいです。
良い方法はないでしょうか?

どうも長い単語で試してみても3〜4文字でしかサジェストを得ることができないようで、他の問題のような気もします…

「貴社の記者が汽車で帰社する」をtokenizeすると「キシャ|ノ|キシャ|ガ|キシャ|デ|キシャ|スル」に分割されます。
それに対し、「キシャノキ」や「キシャノキシャ」は、分割される1つのtokenとなるため、マッチしません。

どう分割されるかは、Analyze APIで確認してみてください。
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html

日本語のように漢字や平仮名やカタカナがある場合は、suggesterだと特定のフィールドしか検索できないので、要件が複雑になればなるほど要件を満たす実装は難しくなります。

多くのケースでは、通常のsearch-apiを利用して、サジェストを実装する方法の方が多いと思います。以下のブログが非常にわかりやすく記載されているので、これをベースに検討するのが良いと思います。

ありがとうございます。理解できました!

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.