1. ホーム
  2. json

[解決済み] Elasticsearchで部分一致を行うにはどうしたらいいですか?

2022-02-07 09:20:25

質問内容

以下のようなリンクがあります。 http://drive.google.com で、リンクから "google" をマッチさせたいのです。

持っています。

query: {
    bool : {
        must: {
            match: { text: 'google'} 
        }
    }
}

しかし、これはテキスト全体が 'google' である場合にのみマッチします(大文字と小文字を区別しないので、Google や GooGlE などにもマッチします)。他の文字列の中の'google'にマッチするにはどうすればよいのでしょうか?

どのように解決するのですか?

ポイントは、使用しているElasticSearchの正規表現が を必要とします。 完全文字列一致 :

Lucene のパターンは常にアンカーで固定される . 提供されるパターン は文字列全体と一致しなければなりません。 .

このように、任意の文字(ただし改行)にマッチさせるためには、次のようにします。 .* のパターンがあります。

match: { text: '.*google.*'}
                ^^      ^^

もう一つのバリエーションは、文字列が改行される可能性がある場合です。 match: { text: '(.|\n)*google(.|\n)*'} . このひどい (.|\n)* はElasticSearchでは必須となります。 [\s\S] の回避策や、DOTALL/Singleline フラグを使用することができます。 Lucene の正規表現エンジンは Perl と互換性がなく、より少ない種類の演算子をサポートしています。

しかし 複雑なパターンにマッチする予定がなく、単語境界のチェックも必要ない場合は、単なる部分文字列の正規表現検索を行うほうがよいでしょう。 ワイルドカード検索 :

{
    "query": {
        "wildcard": {
            "text": {
                "value": "*google*",
                "boost": 1.0,
                "rewrite": "constant_score"
            }
        }
    }
} 

参照 ワイルドカード検索 をご覧ください。

注意事項 : ワイルドカードパターンは入力文字列全体にもマッチする必要があります。

  • google* はすべての文字列を検索します で始まる google
  • *google* はすべての文字列を検索します を含む google
  • *google はすべての文字列を検索します で終わる google

また、ワイルドカードパターンで唯一の特殊文字の組を覚えておいてください。

?, which matches any single character
*, which can match zero or more characters, including an empty one