しばらく、SharePoint 検証環境構築が続いていたのですが、ここで、検索小話を1つ挟みます。
SharePoint 2013 で検索していて、日本語でどうにもこうにも上手く検索が出来ない時が発生します。
今回は、この場合で、言語判定誤認識により特定のアイテムだけが検索出来ない場合の対処についてです。

- 言語判定誤認識の確認方法
- 言語判定誤認識の解決方法
上手く検索出来ない場合の原因の1つとして、言語判定誤認識の場合があります。
SharePoint 2013 での検索の基本的な考え方として、クロール時には、検索対象の文書やアイテムについては、それぞれ毎に言語判定を行って、その言語に従ってワードブレーク処理によって、単語分解した上でインデックスが作成されます。
また、検索時には、ブラウザやユーザープロファイルの言語設定に従って、検索キーワードがワードブレークされて、単語分解された結果とインデックスのマッチングが行われて、検索結果が返されます。
バージョンが古い情報ですが、基本的な考え方については、こちらの解説が参考になります。
・SharePoint の検索アーキテクチャ (MOSS 2007/SPS 2010)
http://blogs.technet.com/b/sharepoint_support/archive/2013/02/15/sharepoint-lt-moss-2007-sps-2010.aspx
問題となるのは、クロール時の言語判定で、文書については、Offie 文書などは文書内に作成した環境に応じた言語設定が埋め込まれているため、誤認識することはありませんが、リストのアイテムなどは言語設定を持っていないため、アイテム内の文字列の内容に従って言語判定を行うのですが、文字列の内容が少ないと、誤った言語判定が行われてしまい、誤った言語判定に基づいてワードブレーク処理が行われてしまうため、インデックスと検索キーワードが正しくマッチング出来ないという現象が発生します。
この問題は、リストアイテムだけで無く、ユーザープロファイルでも起こり得るので、ひと検索で上手く検索出来ない場合にも該当します。
なお、誤認識結果については、誤った言語判定が行われる場合と、言語判定が全く出来ずに英語が設定される場合があります。
言語判定が誤認識している場合の確認方法としては、管理プロパティの「DetectedLanguage」の値の内容を見るということになります。
これには、検索 REST サービスを利用することが出来ます。
検索小話 (検索結果 Web パーツ) で紹介している SharePoint 2013 Search Query Tool を使うことも出来ますし、ブラウザ上で検索 REST サービスにリクエストすることも出来ます。
まずは、上手く検索が出来ないアイテムを特定します。
そして、そのアイテムが必ず検索ヒットする検索キーワードを見つけ出します。
ポイントは、英数字などのキーワードで検索するか、日本語であれば短い単語に区切らずに、一塊の単語にすると検索ヒットする場合があります。
ブラウザ上で検索 REST サービスにリクエストする場合には、以下のようなクエリーストリングになります。
?querytext='<検索キーワード>'&selectproperties='Path,Url,Title,language,DetectedLanguage'
この結果で、DetectedLanguage の値を確認して下さい。
日本語で言語判定されている場合は、「ja」という値が入りますが、ご認識された場合は、「ja」以外の値が入っています。

なお、検索キーワードに、以下のような指定を行って、言語判定が日本語以外のものを検索するというアプローチもあります。
DetectedLanguage<>ja
言語判定が誤認識されたアイテムに対して、明示的に言語を指定する方法があります。
これには、管理プロパティの「language」を利用します。
言語判定において、管理プロパティの「language」に値が設定されていると、指定された言語で認識されます。
予め、リストのアイテムに言語識別用のプロパティを追加して、その値に指定したい言語の文字列を設定します。 日本語の場合は「ja」ですね。

一度、クロールを行うと、追加した言語識別用のプロパティに対応するクロール プロパティが作成されますので、これを管理プロパティ「language」に紐づけます。
画面の例では、内部名を「Language」として作成したカスタム プロパティのクロール プロパティに管理プロパティ「language」のマッピングを追加しています。

管理プロパティの設定変更を行ったので、今度はフルクロールを実行します。
これにより、言語判定が誤認識されたアイテムについても、言語識別用のプロパティの値に従って、正しく言語判定が行われるはずです。
結果は、もう一度、検索 REST サービスで確認出来ます。

なお、ユーザープロファイルでも同じで、言語識別用のプロパティを追加して、同じく、管理プロパティ「language」に紐づけることで、同じ問題を解決出来ます。
ということで、今回は、特定のアイテムで検索が出来ない場合についてでした。 検索小話は、まだまだ続きますが、次はどのテーマにしようかな?
Kokuho Hi (Sonorite / SharePoint Technology Center)