分析方法、マッチング方法、関連性に基づくスコア計算、およびソート式
このトピックでは、特定のシナリオで実際の検索結果と期待される検索結果が一致しない理由について詳しく説明します。これを踏まえ、OpenSearchがどのように検索パフォーマンスを向上させるか、そしてさらなる改善を達成するためには何をする必要があるかについても説明します。
ほとんどの場合、以下の方法で検索を実行できます。
LIKE句を使用して、包含一致モードでデータベースをクエリします。
BaiduやGoogleなどの検索エンジンを使用します。検索エンジンに検索クエリを入力すると、検索クエリは意味に基づいて複数の用語に分析されます。分析プロセスは、検索エンジンが直面する重要かつ難しいポイントです。次に、これらの用語が組み合わされて、関連ドキュメントの照合に使用されます。ドキュメントはスコアリングされ、スコアに基づいてソートされ、返されます。
OpenSearchは検索エンジンと同じように動作します。OpenSearchの検索パフォーマンスは、分析方法、マッチング方法、および関連性に基づくスコア計算などの要因の影響を受ける可能性があります。
以下のセクションでは、これらの要因がOpenSearchでどのように機能し、実行されるかについて説明します。
以下のセクションでは、各要因の検索パフォーマンスとシナリオへの影響について、参考のために詳しく説明します。
分析方法
このトピックを始める前に、さまざまな分析方法に精通していることを確認してください。詳細については、テキストアナライザーを参照してください。
マッチング方法
仕組み
検索クエリが複数の用語に分析された後、これらの用語を使用してドキュメントを取得する方法は、どのようなマッチング方法を使用するかに関わってきます。デフォルトでは、OpenSearchはANDの論理関係に基づいてドキュメントを検索します。分析後に得られたすべての用語を含むドキュメントのみが返されます。これは単一の検索クエリに固有です。OpenSearchはさまざまなマッチング方法をサポートしています。たとえば、AND、OR、RANK、ANDNOT、()などの論理演算子を使用して結果を照合できます。これらの論理演算子は、() > ANDNOT > AND > OR > RANKの優先順位でランク付けされます。
例
論理演算子 | 構文 | 説明 |
query=title:"Apple Mobile phone" | タイトルにAppleとMobile phoneが含まれるドキュメントを検索します。 | |
AND | query=title:'Apple' AND cate:'Mobile phone' | タイトルにAppleが含まれ、cateフィールドの値にMobile phoneが含まれるドキュメントを検索します。AND演算子は、クエリ結果の共通部分を返します。 |
OR | query=title:'Apple' OR cate:'Mobile phone' | タイトルにAppleが含まれるか、cateフィールドの値にMobile phoneが含まれるドキュメントを検索します。OR演算子は、クエリ結果の和集合を返します。 |
RANK | query=title:'Apple' RANK cate:'Mobile phone' | タイトルにAppleが含まれるドキュメントを検索します。cateフィールドの値にMobile phoneが含まれるドキュメントには追加ポイントが付与されます。 |
ANDNOT | query=title:'Apple' ANDNOT cate:'Mobile phone' | タイトルにAppleが含まれ、cateフィールドの値にMobile phoneが含まれないドキュメントを検索します。 |
FAQ
質問:KFCなどの特定の用語で始まるドキュメントを検索したい場合はどうすればよいですか?回答:OpenSearchでは、特定の位置にある用語に基づいてドキュメントを取得することはできません。
関連性に基づくスコア計算
前のセクションでは、ドキュメントを取得するために使用される方法について説明しました。ドキュメントが取得された後、これらのドキュメントをソートする方法は関連性に関係します。OpenSearchでは、ソート句を使用してソート設定をカスタマイズできます。ソート句を指定しない場合、デフォルトでsort=-RANKが使用されます。ソート句を使用して、複数のディメンションから、または昇順または降順でドキュメントをソートできます。たとえば、sort=-RANK;+ bonusを使用すると、ドキュメントは最初に関連性に基づいて降順でソートされます。次に、同じスコアのドキュメントは、ボーナスに基づいて昇順でソートされます。このセクションでは、OpenSearchでRANKを使用して関連性に基づくスコア計算を実装する方法に焦点を当てます。RANKは、ラフソート式またはファインソート式で使用できます。
仕組み
OpenSearchでは、ドキュメントは最初にラフソート式に基づいてスコアリングされます。ラフソートプロセスに含まれるドキュメントの数は、rank_sizeパラメーターの値(100万)と同じです。次に、スコアが最も高いN個のドキュメントが、ファインソート式に基づいてスコアリングおよびソートされます。ファインソートプロセスには数百のドキュメントが関係します。ファインソート後、ドキュメントはstartパラメーターとhitパラメーターの値に基づいて返されます。返されるドキュメントの数がNより大きい場合、N個のドキュメントに続く残りのドキュメントは、ラフソートプロセスで得られたスコアに基づいて返されます。
ラフソート式:前の段落で説明した動作原理は、ラフソートプロセスがレイテンシなどの検索パフォーマンスに大きく影響することを示しています。ラフソートプロセスは重要であり、高品質のドキュメントがファインソートプロセスに入り、最終的に返されるかどうかを決定します。これを踏まえ、シンプルだが効率的なラフソートが推奨されます。OpenSearchでは、いくつかの単純な前方インデックス、またはstatic_bm25関数またはtimeliness関数に基づいてラフソートを実行できます。
ファインソート式:ラフソート式を使用して上位N個の高品質ドキュメントが取得された後、ファインソート式を使用してこれらのドキュメントを細かくソートできます。ファインソート式は、数学演算と論理演算をサポートしています。さらに、OpenSearchは、オンラインからオフライン(O2O)へのシナリオなど、典型的なシナリオ向けに豊富な関数と機能を提供しています。これは、関連性によってドキュメントをソートするという要件を満たします。
OpenSearchは、さまざまなシナリオで参照および使用するための組み込みアプリケーションスキーマとソート式も提供しています。
例
シナリオ | 式 | 説明 |
フォーラム:ラフソート | static_bm25() | テキストスコアを概算します。 |
フォーラム:ファインソート | text_relevance(title)*3+text_relevance(body) + if(text_relevance(title)>0.07,timeliness(create_timestamp),timeliness(create_timestamp)*0.5) + (topped+special+atan(hits)*0.5+atan(replies))*0.1 | テキストスコアを計算します 、 適時性スコア テキストスコア、タイムリネススコア、およびその他の属性のスコアを計算します。 |
O2O:ラフソート | sold_score+general_score*2 | 販売量のスコアと包括的な店舗スコアをオフラインで計算します。 |
O2O:ファインソート | 2*sold_score+0.5*reward - 10*distance(lon,lat,u_posx,u_posy) + if ((flags&2) =2, 2, 0)+if(is_open=5,10,0) + special_score | 販売量、配送速度、および時間厳守率のスコアを計算します 距離 、 ビジー状態、操作状態 販売量、配達速度、時間厳守率、距離、混雑状況、営業状況、および人的介入のスコアを計算します。 |
フィクション:ラフソート | static_bm25()*0.7+hh_hot*0.00003 | テキストスコアと人気スコアを計算します。 |
フィクション:ファインソート | pow(min(0.5,max(text_relevance(category),max(text_relevance(title), text_relevance(author)))),2) + general_score*2 + 1.5*(1/(1+pow(2.718281,-((log10(hh_hot)-2)*2-5))))) | 分類関連性、タイトル関連性、作成者関連性のスコアを計算します 、 斬新な品質 分類の関連性、タイトルの関連性、著者の関連性、小説の質、人気のスコアを計算します。 |
Eコマース:ラフソート | static_bm25()+general_score*2+timeliness(end_time) | テキストスコア、包括的な商品スコア、および有効期限スコアを計算します。 |
Eコマース:ファインソート | text_relevance(title)*3+text_relevance(category) + general_score*2+boughtScore*2 + tag_match(ctr_query_value,doc_value,mul,sum,false,true)+.. | テキスト関連性、カテゴリ関連性のスコアを計算します 、 人気、販売者評価 テキストの関連性、カテゴリの関連性、人気、販売者の評価、クリック率(CTR)の推定、および機能ルールのスコアを計算します。 |
FAQ
質問:ファインソート式text_relevance(seller_id)のseller_idフィールドが見つからないのはなぜですか?回答:text_relevance()式は、TEXT型とSHORT_TEXT型のフィールドのみをサポートしています。
質問:2112エラーが報告されるのはなぜですか?回答:query句で指定されたフィールドは、式内のフィールドと同じである必要があります。たとえば、query句query=default:'keyword'には、titleフィールドとbodyフィールドが含まれています。ただし、式text_relevance(title)+text_relevance(author)には、titleフィールドとauthorフィールドが含まれており、authorフィールドはquery句には含まれていません。この場合、2112エラーが報告されます。
ヒント
ドキュメントが取得された後、ソート式を使用して各ドキュメントのスコアが付けられます。検索に無関係なスコアは事前にオフラインで計算でき、general_scoreフィールドを追加してオフラインスコアを格納できます。このようにして、ドキュメントをgeneral_scoreフィールドに基づいてソートできます。これにより、多数の計算が節約され、検索パフォーマンスが向上します。
tag_match関数を使用して、クエリ句とドキュメントの機能に対して多次元演算を実行できます。この関数は、Eコマースで広く使用できます。同様のニーズがある場合は、この関数をお試しください。
OpenSearchは豊富な関数と機能を提供しており、サービスが適切に使用されていれば大きな助けになります。
関連性は多くの要因の組み合わせです。検索パフォーマンスの要件に合わせて、各要因の重みを調整できます。