SharePoint 2013 FAST クエリ言語 (FQL) を使用した開発について

こんにちは SharePoint サポートの森 健吾 (kenmori) です。今回の投稿では、SharePoint 2013 で FAST クエリ言語 (FQL) を使用する方法についてご紹介します。

SharePoint 2013 の検索エンジンは FAST をベースに大幅に再設計されています。そのため、FASTが保持しているクエリ言語である FQL も引き続き使用することができます。
一般ユーザーが Web パーツの設定等でも使用するキーワード クエリ言語 (KQL) と異なり、FQL の特徴としては、より高度なソリューションを実現するために開発者が使用するものです。
例えば完全一致の検索を実行したり、検索範囲を特定の管理プロパティまたはフルテキスト インデックスに属する値に狭めたりするのを可能にする強力なクエリ言語です。

高度な検索ソリューションを実現する際、KQL で実現できない様々なご要望を実現する際に FQL を確認することになるかと思います。
今回の投稿では FQL を使用した具体的なソリューションの例についてはご紹介しません。あくまで使用方法に関する説明とさせていただきます。実際に FQL 構文を使用する際については以下のリファレンスをご確認ください。

タイトル : FAST クエリ言語 (FQL) 構文のリファレンス
アドレス : https://msdn.microsoft.com/ja-jp/library/ff394606.aspx

 

FQL を使用するための事前準備 ( 検索先の設定 )

FQL を使用する際に、最もつまずきやすいポイントを最初にご紹介します。

タイトル : SharePoint 2013 で検索クエリを作成する
アドレス : https://msdn.microsoft.com/ja-jp/library/jj163973.aspx#SP15Buildquery_support
参考箇所 : SharePoint Server 2013で検索クエリを構築するためにサポートされる検索構文

上記のサイトに記載されている通り、SharePoint Server 2013 では明確な検索先の指定がない場合は既定の検索先が使用されます。
既定の検索先 (Local SharePoint Results) の"クエリの変換" 項目には以下の文字列が格納されています。

{?{searchTerms} -ContentClass=urn:content-class:SPSPeople}

このクエリ テンプレート内の {searhTerms} トークンがユーザー指定の検索キーワード QueryText に変換されて検索されます。
しかし、この検索先が保持するクエリ テンプレート側に KQL 構文が含まれています。そのため、この検索先を使用して FQL を実行すると、どのような検索キーワードを指定して検索しても構文エラーとなってしまいます。
対処策としては、上記サイトに記載されているように既定の検索先のクエリテンプレートの文字列を変更する方法があります。 
その方法としては、以下があります。

検索先を変更する方法

(1) Search Server Application の既定の検索先 (Local SharePoint Results) の "クエリの変換" を直接書き換える。
(2) 新しく作成した検索先を "既定の検索先" (チェックが付きます) とする。
(3) 新しく作成した検索先を検索時に明示的に指定する。

方法 (2), (3) で記載した新しい検索先を作成するためには、既定の検索先をコピーして別の検索先を作成する方法が便利です。

上記のいずれかの方法でできあがった検索先に "クエリの変換" として下記の FQL 互換のクエリ変換文字列を指定します。

・全体を検索対象とする場合 (KQL のみを除外)
{?{searchTerms}}

・ひとを除外する場合 (KQL を FQL に変換)
{?andnot({searchTerms},filter(contentclass:"urn:content-class:SPSPeople*"))}

 

 

KeywordQuery クラスを使用した FQL プログラミングの例

前回の投稿 SharePoint 2013 検索のためのサーバーオブジェクトモデルについて で記載したサンプルと大きく変更はありません。
異なる点としては以下の 2 点です。

1. KeywordQuery.EnableFQL プロパティを true に指定する必要があります。
2. KQL を含まないクエリ変換文字列を含む検索先の指定
    (既定の検索先に前項の対処を施した場合は、検索先の明示的な指定は必要ありません)

SearchServiceApplicationProxy ssap = (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.GetContext(mySite)); 
Microsoft.Office.Server.Search.Query.KeywordQuery myQuery = new Microsoft.Office.Server.Search.Query.KeywordQuery(ssap);
myQuery.QueryInfo.AdvancedSearch = true;

// 注意 1 : FQL を有効にする
myQuery.EnableFQL = true;

// 注意 2 : 検索先を切り替える
SourceRecord source = searchProxy.GetResultSourceByName("FQL使用のための検索先名", new SearchObjectOwner(SearchObjectLevel.SPSite, mySite.RootWeb));
myQuery.SourceId = source.Id;

// FQL を指定します。
myQuery.QueryText = "author:starts-with("kengo")";

myQuery.SelectProperties.Add("Title");
myQuery.SelectProperties.Add("Path");
myQuery.SelectProperties.Add("ContentTypeId");
myQuery.SortList.Add("Rank", SortDirection.Descending);
SearchExecutor mySearchEx = new SearchExecutor();

ResultTableCollection myResultCol = mySearchEx.ExecuteQuery(myQuery);
ResultTable myResultTable = myResultCol.Filter("TableType", KnownTableTypes.RelevantResults).Single(relevantTable => relevantTable.QueryRuleId == Guid.Empty);
DataTable myDataTable = new DataTable();
myDataTable.Load(myResultTable, LoadOption.OverwriteChanges);
dataGridView1.DataSource = myDataTable;

 

REST API を使用した FQL プログラミングの例

SharePoint 2013 では REST API が大量に拡充されており、以下のような URL を要求するだけで検索結果も取得することができます。.NET Framework をベースとしない様々なソリューションからも、HTTP クライアントオブジェクトから GET 要求を行うだけで SharePoint 検索 API を使用した様々な機能が実現できますので、併せてご参考にしていただけますと幸いです。

本項の詳細については以下のページに記載があります。

タイトル : SharePoint Search REST API overview
アドレス : https://msdn.microsoft.com/en-us/library/jj163876.aspx

 

事前準備

REST API を IE で試す際は、以下の設定を忘れずに実施しておきましょう。

1. [ツール] – [インターネット オプション] をクリックします。
2. "コンテンツ" タブをクリックし、[設定] をクリックします。
3. "フィードの読み取りビューを有効にする" のチェックを外します。
4. [OK] をクリックします。

方法

とても簡単です。URL に以下のようなクエリ文字列を打ち込むだけです。

・既定の検索先を使用する場合
https://server/_api/search/query?querytext='sharepoint'&enablefql=true

・検索先を明示的に指定する場合
https://server/_api/search/query?querytext='sharepoint'&enablefql=true&sourceid='ff8098bb%2De2da%2D46a9%2D911d%2D01a5433df318’

 (補足)
検索先の GUID を確認する方法については、Search Service Application または [サイトの設定] 画面から [検索先] に遷移し、該当検索先をクリックして "検索先の編集" 画面に遷移します。
この時にブラウザのアドレス バーに表示される URL パラメータに以下のような記載があるので、これにシングル クオーテーションを加えて使いましょう。

 &sourceid='ff8098bb%2De2da%2D46a9%2D911d%2D01a5433df318'

 

 さて、FQL はこれから!というところで申し訳ないですが、今回の投稿は以上とさせていただきます。