ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

P2Pの検索システムって、結局、RSSリーダーの変形でできるんだけどね。

2006-06-22 21:29:23 | Weblog

 yooseeさんからいただいたコメントのお返事にも書いたとおり、いままで、P2Pの検索システムってかいてきたけど、それが、どーいう仕組みなのか、っていうことを書かないと、どこが、どうすごいんか?っていうことが分かりませんよね。
(技術的にはまったくすごくありません。コロンブスの卵です。でも、結果はすごいんです)。

 ということで、今回は、そのしくみについて、書きたいと思います。




■しくみ
 表示部と検索部にわかれます。




■表示部
 検索用語を入れられたら、あらかじめ、登録してある、プロパティファイルをもとに、検索用のHTTPリクエストをだし、検索結果をRSS形式のXMLで受け取ります。

 そのとき、linkにURL、titleを表題、descriptionの部分を、タイトルの下にある言葉として表示します。

 複数の検索用HTTPリクエストを出すので、同じ検索結果先が出てくる場合もありえます。その場合は1つだけ残して、あとは出力しません(同じ結果が複数出てきたほうが、優先順位が高いとかしても、いいかもしれない)。




 具体例を示します。

プロパティファイルに検索先として

ローカルファイル検索:http://127.0.0.1/cgi-bin/kensaku.cgi?p=%%SJIS%%
会社ファイル検索:http://192.168.0.1/cgi-bin/kensaku.cgi?p=%%SJIS%%
YOU TUBE検索:http://www.youtube.com/rss/tag/%%UTF-8%%.rss
YAHOO 商品検索:http://psearch.yahoo.co.jp/search?p=%%UTF-8%%&first=1&ei=UTF-8

と登録してあったとします(ほんとうは、YAHOO検索とか、Goo検索とか、入れたかったのですが、検索結果をRSSで返してくれないので、YAHOO商品検索とします)

ケータイの場合は、ローカルファイル検索のURLのかわりに、
fs:mod/モジュール名
とかなんとか、書き方を変えます。




で、検索用語に
「はいだしょうこ」
と入れられると、その表示部のプログラムは、%%SJIS%%のところはSJISの16進にかえて、
%%UTF-8%%のところは、UTF-8の16進にキーワードを変換して、検索実行のため、Webを呼び出します。

 すると、結果が上記のものの場合、すべてRSSで返ってくるので、その内容のうち、重複を単一化して、表示します。

 なお、ローカルファイル検索と、会社ファイル検索で呼び出されるkensaku.cgi?p=キーワードにかんしては、次の表示部で書きます





■検索部
 ここは、Get型で、検索対象用語が渡されるので(渡し方に関しては表示部のプロパティに記述する)、テキトーに検索を行って、その結果をRSSで返してくれればいいです。

 テキトーな検索って言うのは、たとえば、なまずをつかって、テキストファイルを全文検索するでもOK。結果をRSSで返してくれればいい。
 なんか、もっと複雑で、かつ検索対象が広い検索ソフトをつくってもOK,結果をRSSで返してくれれば、表示部でみられる。

 ってことは、Googleの社員もしらないような、フォーマットを今考えつき、検索用CGIも作った場合でもOK。その検索用CGIをローカルのサーバーにいれ、ローカルでHTTPサーバープログラムを立ち上げ、
 http://127.0.0.1/cgi-bin/その検索用プログラム.cgi?word=%%SJIS%%
みたいなかんじで、プロパティファイルに書き出しておけば、(そのプログラムはwordに与えられた語を検索するものとする)あとは検索命令を上記フォーマットで書ければRSSで返してくれる。以降の処理は同じってこと。




 さらにいうと、社内独特の暗号をかけたもので、社員にはみせるけど、社外の人間には見せないというのでもOK!(ちょっと改造が居るけど)

 プロパティファイルに
  http://192.168.0.1/cgi-bin/kensaku.cgi?p=%%SJIS%%&pass=%%onepath%%
 みたいなかたちで、かいておいて、

 起動時にサーバーからパスワードを受け取り、
 そのパスワードを、検索時、%%onepath%%にセットするっていうことにすれば、

 パスワードが適切なときだけ、暗号を解除して、検索した結果をRSS形式で返してあげればいい。
 もちろん、さらに表示部を拡張し、RSSの内容に暗号をかけ、表示側で、解除してもよい。




■そうすると、社外の検索システムに必要なことは
 検索側のシステムは、社内外とわず、検索用語が指定されたら、結果をRSS形式で返せばいいことになる。逆にいうと、この形式でないと、つかえない。

 ただ、YOU TOBEやYAHOO商品検索のように,商品以外の検索でも、RSS形式で返してくる可能性は、あると思う(ないと、作らないといけないけどね)




 で、この形式でやれば、出版物の検索は、Googleにデータをスキャンさせなくても、検索可能になるんだけど、それについては、長くなるので、別の機会にしますね。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

検索エンジンに特徴が出れば、検索エンジンのマッシュアップをすることによって。。

2006-06-22 12:05:05 | Weblog

 たとえば、野球についてなら、なんでも検索できる検索サイト、芸能人のことなら何でも検索できる検索サイトと、複数の検索サイトにいっせいに検索をかけ、その結果をまとめるということができる。

 で、これができると、どうなるか。
 現在、オントロジーを利用して、知識体系をつくり、その知識体系にそって検索するという仕組みの検索サイトは作成可能だ。なので、これらの検索サイトを多数組み合わせることによって、広範囲な物事の検索ができる。

 オントロジーを利用した検索サイトはどういう感じかというと、
 まず、知識体系をはじめつくる。
 そして検索内容を自然文で入力する。
 そうすると自然言語処理により、自然文で入力してもらった検索文を分解し、知識体系に基づいて検索する。
 この方法は、可能ではあるが(いまやっている実験もあるが)知識体系をくみあげ、DB化するのに難しい。そのため、野球とか、一部の分野での知識体系化しかできない。

 なので、もっと広い範囲を検索しようとした場合、広範な知識体系を作るというのは至難の業だ。だったら、上記のように、各専門分野ごとの検索サイトをつくり、それらのサイトにいっせいに検索に行ってしまったほうが早い。




 そして、この考えを実現するのにも、まさに先日書いたP2P型の検索システムが必要になる。
 このシステムの場合、検索サイトにWebAPIを利用して、検索をかけ、その結果をまとめる。前回の例では中継局となるサイト1つに問いかけをしていたが、もちろん、これは複数のサイトに問いかけをしても良い。

 なので、野球には詳しいサイト、芸能界には詳しいサイトなど、いろんな専門検索サイトにいっせいに検索要求をWebAPIで投げ、結果をまとめればいいことになる。
 この場合のAPIは、検索用語をGet型で投げると、RSSの形式で返してくれると、ありがたいというか、汎用性があるかもしれない。




 一方、現在のGoogleの検索は、Googleの考える体系でしか検索できない。

 世の中の知識の体系が1つに集約されるのであれば、それはそれでいいが、もし、1つに集約できなかったり、かりにできたとしても、莫大な時間がかかるのであれば、むしろ、専門的な検索サイトを複数立ち上げ、そのサイトでも見つからなかったとき、キーワード検索サイトで検索するようにして、結果をマージしたほうが、現実的である。

 そういう意味でも、P2Pの検索エンジンが、グーグル型(サーバーで全部処理)の検索エンジンを凌駕する可能性はあると思う。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Domによる、XMLデータ操作を、じゃらん宿表示APIで示してみる(その2:説明)

2006-06-22 02:30:39 | JavaとWeb

 以前のブログ「Domによる、XMLデータ操作を、じゃらん宿表示APIで示してみる(その1:仕様とソース)」で書いたソースについての説明です。




■今回説明するものについて

 ここでは、RDBの1レコード分をそのままXMLにしたようなケースを考えます。
 つまり、
 ホテルテーブルに
 ホテルID,住所、ホテル名、電話番号。。。

 などが入っているとき、それを
 <ホテル>
   <ホテルID></ホテルID>
   <住所></住所>
   <ホテル名></ホテル名>
   <電話番号></電話番号>
 </ホテル>

のようにあらわしたものです。

 つまり、XMLのカタチでみると、各項目(住所、ホテル名など)が1つのエレメントとなり、それをまとめた親のエレメント(レコードに相当する:ここではホテル)があるケースです。




■操作方法概要

 上記のようなケースでは、以下の手順で操作していきます。

1.まず、XMLドキュメント全体を取得します
2.それに対して、getElementsByTagName(レコードのタグ名);でレコードの配列を取得します
3.各レコードごとに以下の処理をします
   3-1.対象のノードに対し、selectSingleNode(項目のタグ名)で、
       項目のエレメントを取得します
   3-2.それに対して、nodeTypedValueを行い、値を取得します
   3-3.取得した値をもとに、出力を作ります。





■ソース
 そこで、今回対象となるソースは、以下のとおりです。
//*==============================================//
//*	関数:DataOut()			  *//
//	内容:書き出し			  *//
//*==============================================//
function DataOut()
{
			//	返り値XMLの取得
	xtree = httpObj.responseXML;

			//	ホテルリストの取得
	hotellist = xtree.getElementsByTagName("Hotel");

			//	書き出し
	buf = "";
	for(i = 0 ; i < hotellist.length ; i ++ )
	{
		//	1件分のホテルデータ取り出し
		hotelnode	= 	hotellist[i];

		//	各種データ取り出し
		HotelName = hotelnode.selectSingleNode("HotelName").nodeTypedValue;
		HotelAddress = hotelnode.selectSingleNode("HotelAddress").nodeTypedValue;

		//	書き出し
		buf = buf + "¥n" + HotelName + " " + HotelAddress;
	}
	document.form1.textarea1.value = buf;

}





■ソースの説明

1.まず、XMLドキュメント全体を取得します
 ここにくるまでに、httpObjの中に、取得したXMLが入っているので
xtree = httpObj.responseXML;
 で、xtreeにDomのドキュメントをとりだします。

2.それに対して、getElementsByTagName(レコードのタグ名);でレコードの配列を取得します
 じゃらんAPIの場合、レコードに相当するのがHotelタグで囲まれた
 ホテル1つ分の情報なので、Hotelタグを
hotellist = xtree.getElementsByTagName("Hotel");
 のカタチで取り出します。

3.各レコードごとに以下の処理をします
  で、ホテルの配列がhotellistに入っているので、その配列の要素分、
for(i = 0 ; i < hotellist.length ; i ++ )
  以下の処理を行います。

   3-1.対象のノードに対し、selectSingleNode(項目のタグ名)で、
       項目のエレメントを取得します
   3-2.それに対して、nodeTypedValueを行い、値を取得します

   今回は、複数のタグを処理したいため、
hotelnode = hotellist[i];
   で1件分のホテルレコードを取り出したら、
hotelnode.selectSingleNode(タグ名).nodeTypedValue;
   で、レコードの要素となるタグ、ここでは、HotelNameとHotelAddressのデータを
   取り出します。
      
   3-3.取得した値をもとに、出力を作ります。
   ここは、任意の処理となります。
   ここでは、
buf = buf + "¥n" + HotelName + " " + HotelAddress;
   で、ホテル名と住所を足していき、
document.form1.textarea1.value = buf;
   でその内容を書き出しています。



 今回操作したXMLの構造は簡単なもので、これ以外に属性の値を取得するものや、子レコードの値を取得する場合なども、あるのですが、それについて書く前に、上記の方法と、以前「Domによる表操作:tableとtrの間にtbodyがあるんですね!(Domのお勉強その3)」に書いた、表の書き方とあわせると、もちょっと、ちゃんとしたかっこいいものが書けるので、このシリーズの、次回(すぐに、このシリーズの話をかくか、他の話にするか、いまのところ考えていませんが)は、じゃらんAPIの話とあわせて、表を使ってこれを書いたら、どうなるかの例を示すと、思います。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする