SharePoint で検索結果を並べ替える
SharePoint のクエリ オブジェクト モデルを使用することにより、プログラムを使用して検索結果を (ランク、管理プロパティ値、数式、またはランダムな順で) 並べ替えます。
次の 4 つの方法で SharePoint の検索結果を並べ替えることができます。
検索結果のランクによる並べ替え: 関連性ランクで、検索結果を並べ替えることができます。
管理プロパティ値による検索結果の並べ替え: 検索結果を 1 つ以上の管理プロパティ値に基づいて並べ替えることを可能にします。
数式による検索結果の並べ替え: 検索結果をクエリ要求に指定した数式によって並べ替えることを可能にします。
ランダムな順序での検索結果の並べ替え: 検索結果をランダムな順で並べ替えること、または並べ替えの順序にランダムなコンポーネントを追加することができます。
この記事では、プログラムで検索結果を並べ替える方法について説明します。 SharePoint クエリ ルールを使用して検索結果を並べ替える方法については、次の記事を参照してください。
クエリ要求で並べ替えを指定する方法
Query オブジェクト モデルを使用する場合は、KeywordQuery クラスの SortList プロパティを使用して並べ替え指定を指定することで、並べ替え条件を選択できます。 SortList プロパティは、Sort オブジェクトのコレクションを表すタイプ SortCollection です。
Sort オブジェクトは、検索結果を並べ替える方法を定義します。これは、検索結果を並べ替える値 (プロパティ) と、結果を並べ替える方向 (方向) で構成されます。 方向はタイプ SortDirection() で、昇順または降順を指定できます。
SortList に複数の値がある場合、値が表示されるシーケンスに基づいて並べ替えが実行されます。 つまり、これはすべての Sort オブジェクトが、並べ替え順序のレベルを表すということです。 後続レベルで前の結果によって識別された結果の順序が変更されることはありませんが、前のレベルに同じ並べ替えの値がある場合、結果の内部順序に影響が及ぶ可能性があります。
クエリ オブジェクト モデルとは別に、SharePoint には、クライアントまたはモバイル アプリケーションで検索インデックスをクエリするために使用できる検索 REST サービスも用意されています。 検索 REST サービスは、HTTP POST 要求と HTTP GET 要求の両方をサポートしています。 それらの要求用に URI を構成する方法について詳しくは、「検索 REST サービスでクエリを実行する」を参照してください。
検索結果のランクによる並べ替え
既定では、検索結果は関連性のランクで並べ替えられます。 つまり、SharePoint は、最も関連性の高い結果を検索結果セットの先頭に配置します。 ランクで並べ替える場合、結果は常に降順で並べ替えられます。 ただし、並べ替え順序を昇順に変更するには、 SortDirection()を使用します。
次の 2 つの方法のいずれかを使用して、クエリ文字列のランク計算に影響を与えることもできます。
キーワード クエリ言語 (KQL) 構文のリファレンス および FAST クエリ言語 (FQL) 構文のリファレンス で使用可能な XRANK 演算子を使用する方法。 XRANK を使用して、特定のクエリ条件が満たされた場合に条件付きランク向上を適用できます。
動的ランクにおける関連性の重みを選択する方法。 FQL を使用するとき、 STRING 演算子ごとに個別の関連性の重みを指定できます。
管理プロパティ値による検索結果の並べ替え
1 つまたは複数の管理プロパティの値に基づいて検索結果の並べ替えを指定できます。 つまり、SharePoint は、クエリに一致するすべての結果に基づいて、並べ替えを実行します。
テキスト プロパティと数値プロパティに基づいて並べ替えることができます。 テキスト プロパティの場合、並べ替えは標準のテキスト文字列の並べ替えに基づいています。 一方、数値プロパティ (タイプ DateTime の管理プロパティを含む) の場合、並べ替えは数値に基づいています。
例
次の例では、 Size 管理プロパティを使用して検索結果を並べ替える方法を示します。
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("Size", SortDirection.Descending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"] + " Size:" + result["Size"]);
}
}
または、検索 REST API を使用して、以下の呼び出しで Size プロパティを使用することにより、検索結果を並べ替えることもできます。
http://localhost/_api/search/query?querytext='home'&sortlist='size:descending'
数式による検索結果の並べ替え
並べ替えの値を作成する数式を使用する並べ替えの仕様に基づいて、検索結果の並べ替えを指定することができます。
数式による並べ替えの機能は、検索結果を単一レベルと複数レベルで並べ替える機能の拡張機能です。 この機能では、並べ替え条件として管理プロパティではなく数式を指定することができます。
数式によって並べ替える機能を使用して、検索結果に含まれるアイテムごとに、算術演算を 1 つ以上の管理プロパティの値に適用できます。
以下の例は、検索結果の並べ替えを指定する数式を使用して実装できます。
ドキュメントを分類するための K 近傍法。
地理的な距離を計算するためのユークリッド距離またはマンハッタン距離。
優先値。たとえば、ある管理プロパティ値が優先値からどれほど離れているかに基づいてドキュメントを並び替えるためなどに使用します。
数式による並べ替えの機能には、用語の頻度や類似性など、動的な統計ランク パラメーターのコントロールは含まれません。
数式は左から右に評価され、標準の算術演算子の優先順位が使用されます。 つまり、関数とカッコで囲まれたグループが最初に評価され、乗算と除算が次に行われ、最後に加算と減算が行われます。
重要
数数式の最終結果は、32 ビットの符号付き整数型の値の範囲でなければなりません。 そうでない場合、正確に並べ替えできないことがあります。
クエリによる並べ替えの数式の指定
クエリ要求の並べ替えの指定では、管理プロパティではなく、並べ替えの数式を指定します。
並べ替え仕様の形式は次のとおりです。 [formula:<sort-formula>]
形式では、 <sort-formula> は並べ替え式の式です。
注:
角かっこは、並べ替え仕様構文の一部です。
既定での並べ替えの方向は降順です。 数式が地理的な距離を指定する場合などは、値を昇順で並べ替える数式を使用することもできます。
次のコード例は、クエリ オブジェクト モデルを使用して、昇順で並べ替える数式により並べ替えを指定する方法を示しています。
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[formula:abs(2000-size)]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
または、検索 REST API を使用して、次の呼び出しで Size プロパティを使用することにより、検索結果を並べ替えることもできます。
http://localhost/_api/search/query?querytext='home'&sortlist='[formula:abs(2000-size)]:ascending'
並べ替えの数式での管理プロパティの使用
タイプ Integer、Decimal、および Datetime() の管理プロパティの値に、並べ替えの数式を適用できます。 検索スキーマで指定した管理プロパティに対して並べ替えを有効にする必要があります。
Decimal 型のより多くの管理プロパティの場合、数式の評価で使用される前に、値に 10^(10 進数) が乗算されます。
Datetime()](/previous-versions/office/developer/sharepoint-2010/ms500214(v%3Doffice.14)型の管理プロパティの場合、値は、数式評価で使用される前の 29000 年 1 月 1 日以降の 100 ナノ秒の数に変換されます。 その年には 366 日あります。
並べ替えの数式
表 1 では、並べ替えの数式で使用できる関数を示します。 式にスペースを含めることはできません。
表 1. 並べ替えの式表現の関数
関数 | 説明 |
---|---|
+ |
加算を指定します。 |
- |
減算を指定します。 |
* |
乗算を指定します。 |
/ |
除算を指定します。 注: 既定では、ゼロによる除算は例外を発生させ、クエリはエラーで返されます。 errtolast 演算子を使用すると、クエリのエラーを回避し、代わりに、障害が発生したアイテムを結果セットの最後に配置できます。 |
Rank |
アイテムの動的ランクを表す特別なキーワード。 例: abs(rank-100) ランク値 100 からの距離を並べ替え条件として使用します。 |
[0-9.]+ |
数値を整数または倍精度の値で指定できることを示します。 例: 503、3.14、5.4352262 |
[a-z0-9]+] |
関数名として認識されない文字シーケンスは管理プロパティ名として扱われるように指定します。 検索スキーマ内での指定した管理プロパティの並べ替えを有効にする必要があります。 例: 並べ替えの有効な height という名前の管理プロパティを定義できます。 これにより、「height」を数式の中の式として使用できます。 数式は height 管理プロパティの値を使用します。 |
( and ) |
計算をグループ化して優先順位が正しくなるようにするために使用されます。 例: 4*(3+2) |
sqrt(n) |
n の平方根。 |
exp(n) |
pow(2.71828182846,n) と同等の指数関数。 |
log(n) |
n の自然対数。 |
abs(n) |
n の絶対値。 |
ceil(n) |
n の天井。 つまり、 n が整数でない場合は、次の整数に切り上げてみます。 n が整数の場合、n を使用します。 |
floor(n) |
n のフロア。 つまり、 n が整数でない場合は、次の整数に丸めます。 n が整数の場合、n を使用します。 |
round(n) |
n を最も近い偶数に丸めます。 "銀行型丸め" や "偶数丸め" とも呼ばれます。 |
sin(n) |
n ラジアンの正弦。 |
cos(n) |
n ラジアンの余弦。 |
tan(n) |
n ラジアンのタンジェント。 |
asin(n) |
アークシン (ラジアン単位)、 n。 |
acos(n) |
アークコサイン (ラジアン単位) の n。 |
atan(n) |
アークタンジェント (ラジアン単位) の n。 |
pow(x,y) |
x の値を y の累乗に引き上げました。 注: y の値は実数である必要があります。 |
atan2(y,x) |
正の x 軸と指定されたデカルト座標 (x, y) との間の角度 (ラジアン) に対する、2 つの引数を持つ逆正接。 |
bucket(b,n1,n2,…) |
指定された値の分布範囲で式に不連続の値を提供するために使用できる演算子。 表現 b は、管理プロパティあるいはその他の式表現です。 引数 n1、n2、... は数値のしきい値を表します。 任意の数のバケットしきい値を指定することができます。 注: 引数 n1、n2、n3、... は、 次の順序 n1 < n2 < n3 < ... で n1 >= 0 配置する必要があります。 入力表現 b の値は、もっとも近い数字のしきい値に四捨五入されます。 指定された最低しきい値より低い場合、結果の値はゼロになります。 |
errtolast(x) |
数式の例外を処理する方法を制御するために使用できる演算子。 x には任意の数式を指定できます。 この数式式の計算によって、結果セット内の項目の数学的例外 (0 による除算など) が発生する場合、これらの項目は、指定された並べ替え方向に関係なく、並べ替えリストの末尾に表示されます。 |
数式による並べ替えのパフォーマンス特性
並べ替えの式を使用することは、式計算が結果セット内のすべての一致アイテムに適用されることを意味します。 これは、クエリと一致するアイテムの数により、クエリがパフォーマンスに影響するということです。
多くの演算子を含む長い数式はより短い数式も処理時間が必要です。
地理的な距離のための数式による並べ替えの使用
式での並べ替えを使用して、距離に基づくランク付けを適用することができます。 これには、各アイテムの緯度と経度を表す管理プロパティが含まれる必要があります。
たとえば、次の標準の数式のいずれかを使用できます。
マンハッタン距離
ユークリッド距離 (例 2 を参照)
Haversine 式
重要
タイプ Decimal または Float の管理プロパティを使用して、緯度と経度の値を表します。
例
次の例では、クエリ オブジェクト モデルを使用して並べ替えの数式を指定する方法を示します。
例 1. height 管理プロパティが 20 に最も近いアイテムを結果セットの先頭に配置します。
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[formula:abs(20-height)]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
または、検索 REST API を使用して、以下の呼び出しにより、 height 管理プロパティが 20 に最も近いアイテムを結果リストの先頭に配置することもできます。
http://localhost/_api/search/query?querytext='home'&sortlist='[formula:abs(20-height)]:ascending
例 2。 管理プロパティ latitude、 longitude、および height に指定された位置情報に基づく、指定の位置 (ユーザーの位置など) からの真の 3-D ユークリッド距離による並べ替え。 以下の数式は、基本位置が 50/100/200 (緯度/経度/高さ) のときの 3-D ユークリッド距離を提供します。
sqrt(pow(50-latitude,2)+pow(100-longitude,2)+pow(200-height,2))
距離ベースの並べ替えを適用する場合 (距離を数式内の他のパラメーターと組み合わせない)、並べ替え順序は変更されないため、コンポーネントを削除 sqrt()
できますが、クエリのパフォーマンスが向上します。
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[formula:pow(50-latitude,2)+pow(100-longitude,2)+pow(200-height,2)]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
例 3. サイズの値をバケットに丸め、値を 0、5、15、50、100 のいずれかに丸めます。最初に最大値で並べ替えます。
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[formula:bucket(size,5,15,50,100)]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
ランダムな順序での検索結果の並べ替え
クエリ結果のランダムな並べ替えを適用することや、ランダムなコンポーネントを結果の並べ替えに追加することができます。
ランダム並べ替え仕様の形式は次のとおりです。 [random:seed=<seed>:hashfield=<managed property>]
注:
角かっこは、並べ替え仕様構文の一部です。
表 2 では、ランダムな並べ替え仕様のパラメーターについて説明します。
表 2. ランダムな並べ替え仕様のパラメーター
パラメーター | 説明 | 必須 |
---|---|---|
Seed |
ランダムな値を生成するためのシード。 シード値は、ランダム値を生成する関数に入力されます。 この乱数は、最終的な並べ替えで使用されます。 シード オプションのみを使用すると、ランダムに並べ替えられたクエリ結果セットが得られます。 同じクエリの並べ替え順序は (同じシードを使用している場合)、インデックスの更新後に変更される可能性があります。 |
はい |
Hashfield |
乱数の生成のためにハッシュ値として使用される管理プロパティ。 このパラメーターを使用すると、同じクエリの並べ替え順序は (同じシードを使用している場合)、インデックスが更新されても変更されません。 マネージド プロパティは Integer 型で、 Sortable()である必要があります。 この管理プロパティには、ランダム値や一意の値 (アイテムの処理ステージで生成されるシーケンス番号など) を入力できます。 |
いいえ |
等しいクエリに対して同じシードを指定すると、アイテムは同じ順序で示されます。 これにより、検索結果をページングするときに同じランダム順序を保持できます。 クエリ間でインデックス更新が誤って発生したときに同じランダム順序を保持する必要がある場合は、hashfield パラメーターを使用します。
例
次の例では、クエリ オブジェクト モデルを使用して、ランダムな並べ替えを指定する方法を示します。
例 1. 結果セット全体をランダムな順序で並べ替えます。
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[random:seed=5432]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
または、次の呼び出しで検索 REST API を使用して、結果セット全体をランダムな順序で並べ替えることもできます。
http://localhost/_api/search/query?querytext='home'&sortlist='[random:seed=5432]:ascending
例 2。 結果セット全体をランダムな順序で並べ替えます。 インデックスの切り替えが生じた場合でも、同じシードによる同じクエリでは同じランダム順序が維持されるようにします。 hashvalue というカスタム管理プロパティは、検索スキーマ内で使用可能であること、およびすべてのインデックス アイテムにランダムまたはシーケンスの数値が入力されることが必要です。
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[random:seed=6543:hashfield=hashvalue]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}