🌟

Elastic Searchがめんどくさい

2023/11/19に公開

検索時の注意点(データ設計が大事ってことを学んだかも)

termmatch、および match_phrase クエリはElasticsearchで使われる基本的な検索クエリタイプですが、それぞれが異なる方法でデータをマッチングします。これらの違いを、今回の事例(クラブ名に基づく検索)を用いて説明します。

1. term クエリ

term クエリは、指定された正確な値と完全に一致するドキュメントを検索します。このクエリは、フィールド値のトークン化や解析を行いません。たとえば、term クエリを使用して "eventName": "サッカー" を検索すると、フィールド値が正確に「サッカー」であるドキュメントのみがヒットします。このクエリは、大文字小文字やスペースなども正確に一致させる必要があります。

2. match クエリ

match クエリは、より柔軟な検索を提供します。これは指定された値を解析し、トークン化してマッチングを行います。たとえば、match クエリで "eventName": "サッカー" を検索すると、フィールド値が「サッカー」という単語を含むすべてのドキュメントがヒットします。このクエリは部分一致を許容し、大文字小文字の違いも考慮しないことが多いです。

3. match_phrase クエリ

match_phrase クエリは、指定されたフレーズがフィールド内で完全に、かつ連続して一致する場合にマッチします。このクエリは、フレーズ内の単語の順序や隣接性も考慮します。たとえば、match_phrase クエリで "eventName": "サッカークラブ" を検索すると、フィールド値に「サッカークラブ」という連続するフレーズが正確に含まれているドキュメントのみがヒットします。単純な match クエリとは異なり、このクエリはフレーズの部分一致を許容しません。

事例に基づく適用

今回の事例では、検索結果に「競技カルタ」が「陸上競技」として誤ってヒットする問題がありました。この問題を解決するためには、以下のようにクエリを選択する必要があります:

  • term クエリを使用すると、厳密に指定されたクラブ名と完全に一致するドキュメントのみがヒットします。しかし、このクエリはフィールド値の大文字小文字やスペースを厳密に扱うため、データの形式に注意が必要です。
  • match クエリを使用すると、より柔軟な検索が可能ですが、部分一致を許容するため、「競技カルタ」と「陸上競技」が誤って一致する可能性があります。
  • match_phrase クエリを使用すると、指定されたフレーズが完全に、かつ連続して一致する場合にのみマッチします。これにより、「競技カルタ」と「陸上競技」の誤一致を防ぐことができます。

したがって、厳密なフレーズマッチングが必要な場合、match_phrase クエリが最適です。これにより、特定のフレーズが完全に一致するドキュメントのみを検索結果として取得することができます。このアプローチは、「競技カルタ」と「陸上競技」のような誤一致を避けるのに特に効果的です。

たとえば、"eventName": "サッカークラブ" のようなフレーズで match_phrase クエリを使用すると、フィールド値に「サッカークラブ」という連続するフレーズが正確に含まれているドキュメントのみがヒットします。この方法は、フレーズの単語の順序や隣接性も考慮するため、検索結果の精度が高まります。

Elasticsearchのクエリを選択する際には、データの特性と検索要件を総合的に考慮することが重要です。term クエリは厳密な一致を要求するため、データの形式化や一貫性が重要です。match クエリはより柔軟で使いやすいですが、部分一致や異なるトークン化方法により、意図しない結果が生じる可能性があります。match_phrase はこれらの中間に位置し、フレーズの完全一致を要求しながらも、ある程度の柔軟性を提供します。

最終的には、どのクエリを使用するかは、検索要件、データの特性、および使用するアナライザーの性質に基づいて決定する必要があります。

Discussion