- 2009-02-05 (木) 2:49
- Windows Server 2008
ページ : 1 2
<この記事を全て表示する場合はこちらをクリック>
XML生成用ファイルの設置
検索サーバの、以下のディレクトリにフォルダ”SEARCH”を作成します。
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\LAYOUTS\
さらにその中に”Google.aspx”と”Google.aspx.cs”を保存し、”Google.aspx.cs”の中身を以下の文字列で上書きします。
※Googleの検索結果が変更になった場合、動作しなくなる可能性がありますのでご注意を。
using System;
using System.Data;
using System.Net;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
public partial class _Default : System.Web.UI.Page
{
protected string query;
protected void Page_Load(object sender, EventArgs e)
{
query = Request.QueryString["q"];
}
protected override void Render(HtmlTextWriter writer)
{
StringBuilder sb = new StringBuilder();
Response.ContentType = "text/xml";
sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
sb.Append("<rss version=\"2.0\">");
sb.AppendFormat("<channel><title><![CDATA[Google: {0}]]></title><link/><description/><ttl>60</ttl>", query);
sb.Append(getRssItemXml(query));
sb.Append("</channel></rss>");
writer.Write(sb.ToString());
}
private string getRssItemXml(string query)
{
string url = string.Format("http://www.google.co.jp/search?q={0}", query);
WebRequest myrequest = HttpWebRequest.Create(url);
myrequest.Method = "GET";
// レスポンスデータ取得
string strData;
using (WebResponse myresponse = myrequest.GetResponse())
using (StreamReader reader = new StreamReader(myresponse.GetResponseStream(), System.Text.Encoding.Default))
{
// データ取得
strData = reader.ReadToEnd();
}
Regex searchCountPattern = new Regex("の検索結果 約 <b>(.+?)</b> 件中 <b>([0-9]+?)</b> - <b>([0-9]+?)</b> 件目");
Regex searchPattern = new Regex("<li class=g><h3 class=r><a href=\"(?<link>.*?)\"(.*?)>(?<title>.*?)</a>(.*?)</h3><div class=\"s\">(?<desc>.*?)<br><cite>", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline);
StringBuilder sb = new StringBuilder();
int endpos = 10;
if (searchCountPattern.IsMatch(strData))
{
Match match = searchCountPattern.Match(strData);
if (match.Groups.Count == 3)
{
endpos = Convert.ToInt32(match.Groups[2]) - (Convert.ToInt32(match.Groups[1]) - 1);
}
}
int i = 0;
foreach (Match m in searchPattern.Matches(strData))
{
sb.AppendFormat("<item><title><![CDATA[{0}]]></title><link><![CDATA[{1}]]></link><description><![CDATA[{2}]]></description></item>", m.Groups["title"].Value, m.Groups["link"].Value, m.Groups["desc"].Value);
i++;
if(i >= endpos)
{
break;
}
}
return sb.ToString();
}
}
2009年2月7日追記
searchPatternを以下に変更すると早くなった気がするんだけど・・・どうでしょうか。
でも根本的にどこが原因なのか分かってません。
Search Server 2008の検索結果にキャッシュとかの表示は必要ないのかなと思い、その部分を削ってみました。
Regex searchPattern = new Regex("<li class=g><h3 class=r><a href=\"(?<link>.*?)\"(.*?)>(?<title>.*?)</a>(.*?)</h3><div class=\"s\">(?<desc>.*?)<br><cite>");
動作確認
以下のサイトにアクセスし、検索結果が正常に出力されているか確認します。
http://<サーバ名>/_layouts/search/google.aspx?q=<検索文字列>
正常に出力されていれば、これで設定完了です。
Search Server 2008へパーツとして組み込み
サイトの操作権限のあるアカウントで検索結果画面にアクセスし、”ページの編集”を選択します。
“WEBパーツの追加”を選択し、”フェデレーション検索結果”にチェックを入れ、”追加”を選択します。
“共有WEBパーツの変更”を選択します。
“場所”の選択で”Google”を選択し、”OK”を選択します。
“編集モードの終了”を選択し、完了です。
既知の問題点
英数字を検索すると結果が返ってくるのが早いのですが、2バイト文字を検索するとたまに激しく重い上にCPUリソースの使いっぷりが凄まじくなります。
例えば”フェデレーション”で検索するととても高速ですが、”自転車”と検索すると反応が返ってくるまでに30秒くらいかかってしまいます。
こちら何かご存じの方いらっしゃれば是非教えてください。
遅い件、解決しました。
参考リンク
Search Server 2008: Federated sites that do not return XML
http://www.21apps.com/sharepoint/search-server-2008-federated-sites-that-do-not-return-xml/
Popularity: 2% [?]
ページ : 1 2
<この記事を全て表示する場合はこちらをクリック>
関連する記事
- Newer : 管理共有の設定変更方法
- Older : Search Server 2008にGoogle検索を追加する(未解決版)
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://pnpk.net/cms/archives/1263/trackback
- Listed below are links to weblogs that reference
- Search Server 2008にGoogle検索を追加する from http://pnpk.net





