0

タグのリストを含む文字列コレクションであるフィールドを持つインデックスがあります。

タグ文字列コレクションと照合するタグのリストを使用して、インデックスをクエリする最も効率的な方法を知っている人はいますか?

これは、私がやろうとしていることの非常に非効率的な例です: /indexes/instruments/docs?api-version=2014-07-31-Preview&$top=10&$skip=0&$count=true&search=*&$filter=universes/any(t: t eq 'U') or universes/any(t: t eq 'B') or universes/any(t: t eq 'E')

この例では、tags フィールドは「universes」です。問題は、30 個ものタグをフィルター処理する必要があることです。そのため、このクエリはひどいものに思えます。

4

2 に答える 2

2

これは、このクエリを表現する正しい方法です。構文的には長く見えますが、効率の観点からは問題なく動作するはずです。応答時間を支配するのは、ここでの用語の数ではなく(少なくともあなたが言及した大きさのオーダー)、一致するセットの大きさです。

2017 年 10 月 16 日更新: Azure Search に新しいフィルター関数 search.in() が追加されたことに注意してください。これにより、このようなクエリのよりコンパクトな表現と高速な実行が可能になります。詳細と API バージョンの要件はこちら: https://docs.microsoft.com/en-us/rest/api/searchservice/odata-expression-syntax-for-azure-search

于 2015-03-04T17:22:09.673 に答える
0

明示的なフィルターを実装したいので、クエリは実際に実行できる最善の方法です。このスタイルのフィルターは、任意の順序でタグを処理するため、複数のタグの連結結果であるフィールドを挿入することによってインデックスを「修正」することを含む他のソリューションよりも優れています。

30 以上のタグの場合、タグ「ブースト」スコアリング プロファイルを使用して良い結果が得られる場合もあります。次に、必要なタグをパラメーターとして渡し、結果に不当に高いブーストを与えることができます。タグで具体的にフィルタリングする必要がある場合、このシナリオではクライアントでフィルタリングして、ブースト プロファイルからスコアを受け取っていない結果を削除する必要があります。

http://azure.microsoft.com/blog/2015/02/05/personalizing-search-results-announce-tag-boosting-in-azure-search/

于 2015-08-24T23:46:22.240 に答える