テキスト検索の結果表示にページ本文を含める

  • ページ: BugTrack
  • 投稿者: toba?
  • 優先順位: 低
  • 状態: 完了
  • カテゴリー: 本体新機能
  • 投稿日: 2004-09-16 (木) 09:39:26
  • バージョン: 1.4.4
  • リリース予定バージョン: 1.5.2

メッセージ

PukiWiki/1.4/ちょっと便利に/単語検索の結果表示を拡張の標準化を希望します。
小規模なサイトには非常に便利なこの機能があれば、検索結果一覧からページを選択して見ていくのに、一覧の時点である程度のマトが絞られ、非常に便利かと思います。
勿論、中・大規模なサイトでは負担が増える場合が想定されるので、pukiwiki.ini.phpあたりで機能のON・OFFが選択できると、運用していく過程で小規模→中・大規模になって、負担が増えた場合に運用方法の変更ができるのではと思います。


 

BugTrack/607より:

pukiwiki.ini.php できりかえられるとよいかと思います。

//検索の際にページ名だけではなくマッチした行も表示する
$search_detail = 1;

のように。

まだ問題点があるようですが、改善含めてよろしくお願いします。

関連


  • 20件ずつ表示とかなら便利ですね。 -- あーる? 2004-09-30 (木) 23:17:09
  • うーむ、すでに副作用が挙げられていますね (^^; -- henoheno 2004-10-01 (金) 21:05:25
  • 副作用の解決案です。検索結果を整形済みテキストにすることで、エラーは発生しなくなるかと思います。-- teanan 2005-05-16 (月) 14:47:12
do_search_diff.gif
  • いい感じですね ;) 絵を張っときました。既存の検索と切り替えができないので現状 patch提供のみになりそうですね・・・。ところでdo_search()、何か直せそうな所は無いでしょうか -- henoheno 2005-05-17 (火) 21:50:53
  • Wiki書式のままの出力ってカッコ良くはないですけど、//のコメントも検索に引っかかる仕様も考えると、都合良いときもあるような (ので賛成に一票)。 -- にぶんのに? 2005-05-17 (火) 23:13:22
  • あら、まだ無駄なcountが残ってましたね (^^; 差分をかなりシェイプアップしたので、機能のON/OFFへの対応は簡単です :) -- teanan 2005-05-23 (月) 18:09:22
pukiwiki.ini.php : 233行目あたりが最適か?
/////////////////////////////////////////////////
// Search detail
// 0: only page name
// 1: content in detail
$search_detail = 0;
--- func.php.orig	Sun Feb 20 21:50:06 2005
+++ func.php	Mon May 23 18:20:47 2005
@@ -177,6 +177,7 @@
	global $script, $whatsnew, $non_list, $search_non_list;
	global $_msg_andresult, $_msg_orresult, $_msg_notfoundresult;
	global $search_auth;
+	global $search_detail;

	$retval = array();

@@ -201,12 +202,14 @@
			array_unshift($source, $page); // ページ名も検索対象に

		$b_match = FALSE;
+		$lines = array();
		foreach ($keys as $key) {
			$tmp     = preg_grep('/' . $key . '/', $source);
			$b_match = ! empty($tmp);
+			$lines += $tmp;
			if ($b_match xor $b_type) break;
		}
-		if ($b_match) $pages[$page] = get_filetime($page);
+		if ($b_match) $pages[$page] = array(get_filetime($page), $lines);
	}
	if ($non_format) return array_keys($pages);

@@ -217,13 +220,21 @@

	ksort($pages);
	$retval = '<ul>' . "\n";
-	foreach ($pages as $page=>$time) {
+	foreach ($pages as $page=>$arr) {
+		list($time, $lines) = $arr;
		$r_page  = rawurlencode($page);
		$s_page  = htmlspecialchars($page);
		$passage = get_passage($time);
		$retval .= ' <li><a href="' . $script . '?cmd=read&amp;page=' .
			$r_page . '&amp;word=' . $r_word . '">' . $s_page .
			'</a>' . $passage . '</li>' . "\n";
+		if ($search_detail == 1) {
+			$source = '';
+			foreach ($lines as $line) {
+				$source .= ' '.trim($line)." \n";
+			}
+			$retval .= convert_html($source);
+		}
	}
	$retval .= '</ul>' . "\n";

実装案B by umorigu

検索負荷が高いのが気になっていましたので、JavaScriptを使って再実装しました。

  • search2プラグイン(新設)による実装
  • JavaScript利用: 検索語が見つかったページの本文をサーバーからクライアント(ブラウザ)に渡し、ブラウザ側で本文を表示・検索語を強調表示する
  • 詳細表示のON/OFFを切り替えられる(CSS利用)
  • BugTrack/2434 検索のキャンセル
    • (サーバー負荷に影響するのは主にこれ)
  • ページング表示なし。1ページで検索結果をすべて表示する
  • ブラウザ側要件: HTML5 - Fetch API
    • ブラウザがFetch APIに対応している場合、JavaScriptロジックにより、searchプラグインへのリクエストをsearch2へのリクエストに置き換える。非対応ブラウザの場合、従来のsearchプラグインでの処理になる

残件 (2017/09/25現在)

  • (a) DONE pg_passsage表示
  • (b) DONE OR検索対応
  • (c) DONE JavaScript skin/search2.js を skin/main.js に統合するかどうか
    • 既に220行になっており、main.js (240行) と統合するには大きすぎるかもしれない。search2.js の利用有無だけで詳細表示/従来表示を切り替えられる利点もある。
    • 400行になった。分離したままの方がよさそう
  • (e) DONE Fetch APIエミュレーションでIE11対応できるか否かの確認
    • github.com:stefanpenner/es6-promisegithub.com:github/fetch を使いIE10とIE11での動作を確認した
    • IE6で旧検索が動作することを確認
    • 条件付きコメントでsearch2.jsを読まないようにすることで、Polyfillを使いIE7,IE8,IE9で正常に旧検索が動作することを確認
  • (f) DONE EUC-JPでの動作の確認 (動作するようにする or EUC-JPではsearch2が動かないようにする)
    • EUC-JP対応した
  • (g) DONE サーバー側とクライアント側で検索ロジックが違うことへの対応 (ひらがな/カタカナの違いに対応できていない)
    • ひらがな・カタカナ・半角カタカナ どれでも強調表示される実装にしました
  • (h) DONE 詳細の最初の見出し、または本文の冒頭部分が表示されると便利
    • 主に BugTrack - ページ名が番号のため、ページ名だけでは何についてのバグかわからない
    • 本文の先頭150文字を表示するようにした
  • (i) DONE PHP5.4未満で実行しないようにする
  • (j) DONE リンク先での強調表示
    • DONE Firefoxで強調表示されない
  • (k) DONE base対応
  • (l) DONE search2による新URLを非対応ブラウザで開いた時の挙動

  • JavaScriptを利用して分割して検索することで、サーバー負荷を軽減することを考えています -- umorigu 2017-02-22 (水) 07:22:31
    • 負荷軽減というより負荷分割ですね。CPU1コアに対して負荷100%の処理が1分続くより、10秒の処理を7回の方が(他の処理を割り込ませられるので)複数人で使う場合に利便性が高い -- umorigu 2017-02-22 (水) 08:09:31
  • 仮で実装しました。モダンブラウザ限定(具体的には Fetch API が使えるもの限定)で、詳細表示を行います。PukiWiki-dev で有効にしてみました。これで検索がかなり便利になります。サーバー側の検索ロジックはほぼ同じで、検索でヒットしたページの本文をブラウザに返すようにしました。詳細表示そのものはブラウザ側のJavaScriptロジックで行っています。 commit:b92fd30604 -- umorigu 2017-09-18 (月) 08:32:07
    • IE11はFetch API非対応のため利用できません。Chrome, Firefox, Edge, Safari等のブラウザの最新版でお使いください。非対応ブラウザでは旧ロジックでの検索になります -- umorigu 2017-09-18 (月) 08:34:41
  • 元の提案の実装とはずいぶん変わっていますのでタイトルを変更しました。『「単語検索の結果表示を拡張」の標準化』→『テキスト検索の結果表示にページ本文を含める』 -- umorigu 2017-09-18 (月) 10:04:58
  • 残件を書き出してみました。結構多い... -- umorigu 2017-09-18 (月) 12:04:22
  • 実装更新して、このサイトPukiWiki-devの実装も追従させました。あと一息 -- umorigu 2017-09-25 (月) 05:22:13
    • github.com:stefanpenner/es6-promisegithub.com:github/fetch を使ってIE11でも動作するようにしてあります。(カスタマイズ対応) -- umorigu 2017-09-25 (月) 07:51:57
    • お疲れ様です。それぞれMITライセンスですが、(カスタマイズ対応)とある事からすると、それぞれをマージした先(述語)はこのサイト(のみ)ですか?それともPukiWikiのgitリポジトリもカスタマイズの対象ですか? -- henoheno 2017-09-25 (月) 23:01:19
    • 「それぞれをマージした先はこのサイト(のみ)ですか?」に対してYesになります。PukiWikiのリポジトリにはこれらのライブラリ(あるいはライブラリを参照するscriptタグ)を含みません。PukiWiki(Development Team; 配布者)としては「IE対応が必要な場合はサイト管理者が適宜Polyfillライブラリ利用のカスタマイズを行ってください」というスタンスになります。その上で、PukiWiki-devサイトは、IE対応するためにカスタマイズを行っている、という状態です。 -- umorigu 2017-09-26 (火) 07:16:45
    • 了解しました。仮にそれらがリポジトリや配布物に含まれる事になる場合、仮にそれぞれが別個の著作物として区別して取り扱うことができるように構成されているのであれば、フォルダ等でどこからどこまでが誰による著作物であるかを明確に区別できる構成が求められる事になるでしょう。(ここで触れているのはGPL ライセンスの著作物に MITライセンスの著作物をマージ可能である、というライセンスの話題よりも前の段階の話です) -- henoheno 2017-09-27 (水) 00:37:15
    • ありがとうございます。外部ライブラリを含めるときにはその辺りを意識して対応したいとおもいます -- umorigu 2017-09-27 (水) 08:38:47
  • 残件をすべて実装しました。完了とします commit:15e6dda251 -- umorigu 2017-09-30 (土) 18:47:23
  • BugTrack/2433 テキスト検索の時分割実行とキャンセル -- 2017-10-03 (火) 22:10:16


*1 pukiwiki-1.4.5_1 で最小の差分になるようにしています。

添付ファイル: filedo_search_diff.gif 313件 [詳細] filesearch_pre.diff.1.4.5_1.txt 921件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-10-03 (火) 22:10:17
Site admin: PukiWiki Development Team

PukiWiki 1.5.1+ © 2001-2016 PukiWiki Development Team. Powered by PHP 5.6.30-0+deb8u1. HTML convert time: 1.097 sec.

OSDN