布団の中にいたい

Androidアプリ開発の勉強をしている傍らで、elasticsearchとかをいじってみたりしています。最近は数学の勉強が楽しくなってきました。

ElasticsearchのWildcardQueryを使った部分一致検索

ElasticsearchでMySQL的なLIKE検索をやろうとしてちょっとハマったのでメモ。

Elasticsearchで部分一致検索を実装するにはWildcardQueryを使います。WildcardQueryMySQLのLIKE文による検索に近く、ある程度同じようなことができます。

以下は簡単な例。 この場合だと、contentというプロパティで入力したクエリを含むものを検索結果として出力します。

{
    "query": {
        "bool": {
            "must": [
                {
                    "wildcard": {
                        "content": "*検索したいクエリ*"
                    }
                }
            ]
        }
    }
}

ここで若干ハマったのですが、wildcardで検索するクエリはindexされているものと比較されているようです。つまり、kuromoji_tokenizerなどを使って、contentをparseしていると、検索したいクエリと部分一致が取れず検索結果が0件という状態になります。とりあえずどうしていいか分からなかったので、部分一致用のプロパティを作って検索する際にはそこを参照するようにしてなんとか解決しました。

まとめ

elasticsearchでWildcardQueryを使って、MySQL的な部分一致検索ができました。wildcardで指定するためのプロパティを作らないといけなかった所で詰まりましたが、概ね解決してよかったです。