分析方法、マッチング方法、関連性に基づくスコア計算、およびソート式
このトピックでは、特定のシナリオで実際の検索結果と期待される検索結果が一致しない理由について詳しく説明します。これを踏まえ、OpenSearchがどのように検索パフォーマンスを向上させるか、そしてさらなる改善を達成するためには何をする必要があるかについても説明します。
ほとんどの場合、以下の方法で検索を実行できます。
LIKE句を使用して、包含一致モードでデータベースをクエリします。
BaiduやGoogleなどの検索エンジンを使用します。検索エンジンに検索クエリを入力すると、検索クエリは意味に基づいて複数の用語に分析されます。分析プロセスは、検索エンジンが直面する重要かつ難しいポイントです。次に、これらの用語が組み合わされて、関連ドキュメントの照合に使用されます。ドキュメントはスコアリングされ、スコアに基づいてソートされ、返されます。
OpenSearchは検索エンジンと同じように動作します。OpenSearchの検索パフォーマンスは、分析方法、マッチング方法、および関連性に基づくスコア計算などの要因の影響を受ける可能性があります。
以下のセクションでは、これらの要因がOpenSearchでどのように機能し、実行されるかについて説明します。
以下のセクションでは、各要因の検索パフォーマンスとシナリオへの影響について、参考のために詳しく説明します。
分析メソッド
このトピックを始める前に、さまざまな分析方法に精通していることを確認してください。詳細については、テキストアナライザーを参照してください。
マッチング方法
仕組み
クエリがいくつかの term に分析された後、マッチングメソッドを使用してドキュメントを取得します。デフォルトでは、OpenSearch は AND の論理関係に基づいてドキュメントを検索します。分析後に得られたすべての term を含むドキュメントのみが返されます。これは単一のクエリに特有の仕様です。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) 予測、特徴ルール。 |
質問:ファインソート式text_relevance(seller_id)のseller_idフィールドが見つからないのはなぜですか?回答:text_relevance()式は、TEXT型とSHORT_TEXT型のフィールドのみをサポートしています。
質問:なぜ 2112 エラーが報告されるのですか? 回答:クエリ句で指定されたフィールドは、数式内のフィールドと同じでなければなりません。たとえば、クエリ句 `query=default:'keyword'` には title フィールドと body フィールドが含まれています。しかし、数式 `text_relevance(title)+text_relevance(author)` には title フィールドと author フィールドが含まれており、author フィールドはクエリ句に含まれていません。この場合、2112 エラーが報告されます。
ヒント
ドキュメントが取得された後、ソート式を使用して各ドキュメントのスコアが付けられます。検索に無関係なスコアは事前にオフラインで計算でき、general_scoreフィールドを追加してオフラインスコアを格納できます。このようにして、ドキュメントをgeneral_scoreフィールドに基づいてソートできます。これにより、多数の計算が節約され、検索パフォーマンスが向上します。
`tag_match` 関数を使用して、クエリ句とドキュメントの特徴に対して多次元操作を実行できます。この関数は E コマースで広く使用できます。
OpenSearch は、柔軟性を高めるために幅広い関数と特徴を提供します。
関連性は多くの要因によって決まります。検索とソートのパフォーマンスに基づいて各要因の重みを調整し、最適な結果を配信できます。