テキスト検索の結果表示にページ本文を含める†
- ページ: BugTrack
- 投稿者: toba
- 優先順位: 低
- 状態: 完了
- カテゴリー: 本体新機能
- 投稿日: 2004-09-16 (木) 09:39:26
- バージョン: 1.4.4
- リリース予定バージョン: 1.5.2
メッセージ†
PukiWiki/1.4/ちょっと便利に/単語検索の結果表示を拡張の標準化を希望します。
小規模なサイトには非常に便利なこの機能があれば、検索結果一覧からページを選択して見ていくのに、一覧の時点である程度のマトが絞られ、非常に便利かと思います。
勿論、中・大規模なサイトでは負担が増える場合が想定されるので、pukiwiki.ini.phpあたりで機能のON・OFFが選択できると、運用していく過程で小規模→中・大規模になって、負担が増えた場合に運用方法の変更ができるのではと思います。
pukiwiki.ini.php できりかえられるとよいかと思います。
//検索の際にページ名だけではなくマッチした行も表示する
$search_detail = 1;
のように。
まだ問題点があるようですが、改善含めてよろしくお願いします。
- 20件ずつ表示とかなら便利ですね。 -- あーる
- うーむ、すでに副作用が挙げられていますね (^^; -- henoheno
- 副作用の解決案です。検索結果を整形済みテキストにすることで、エラーは発生しなくなるかと思います。-- teanan
- いい感じですね ;) 絵を張っときました。既存の検索と切り替えができないので現状 patch提供のみになりそうですね・・・。ところでdo_search()、何か直せそうな所は無いでしょうか -- henoheno
- Wiki書式のままの出力ってカッコ良くはないですけど、//のコメントも検索に引っかかる仕様も考えると、都合良いときもあるような (ので賛成に一票)。 -- にぶんのに
- あら、まだ無駄なcountが残ってましたね (^^; 差分をかなりシェイプアップしたので、機能のON/OFFへの対応は簡単です :) -- teanan
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&page=' .
$r_page . '&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対応できるか否かの確認
- (f) DONE
EUC-JPでの動作の確認 (動作するようにする or EUC-JPではsearch2が動かないようにする)
- (g) DONE
サーバー側とクライアント側で検索ロジックが違うことへの対応 (ひらがな/カタカナの違いに対応できていない)
- ひらがな・カタカナ・半角カタカナ どれでも強調表示される実装にしました
- (h) DONE
詳細の最初の見出し、または本文の冒頭部分が表示されると便利
- 主に BugTrack - ページ名が番号のため、ページ名だけでは何についてのバグかわからない
- 本文の先頭150文字を表示するようにした
- (i) DONE
PHP5.4未満で実行しないようにする
- (j) DONE
リンク先での強調表示
- (k) DONE
base対応
- (l) DONE
search2による新URLを非対応ブラウザで開いた時の挙動
- JavaScriptを利用して分割して検索することで、サーバー負荷を軽減することを考えています -- umorigu
- 負荷軽減というより負荷分割ですね。CPU1コアに対して負荷100%の処理が1分続くより、10秒の処理を7回の方が(他の処理を割り込ませられるので)複数人で使う場合に利便性が高い -- umorigu
- 仮で実装しました。モダンブラウザ限定(具体的には Fetch API が使えるもの限定)で、詳細表示を行います。PukiWiki-dev で有効にしてみました。これで検索がかなり便利になります。サーバー側の検索ロジックはほぼ同じで、検索でヒットしたページの本文をブラウザに返すようにしました。詳細表示そのものはブラウザ側のJavaScriptロジックで行っています。 commit:b92fd30604 -- umorigu
- IE11はFetch API非対応のため利用できません。Chrome, Firefox, Edge, Safari等のブラウザの最新版でお使いください。非対応ブラウザでは旧ロジックでの検索になります -- umorigu
- 元の提案の実装とはずいぶん変わっていますのでタイトルを変更しました。『「単語検索の結果表示を拡張」の標準化』→『テキスト検索の結果表示にページ本文を含める』 -- umorigu
- 残件を書き出してみました。結構多い... -- umorigu
- 実装更新して、このサイトPukiWiki-devの実装も追従させました。あと一息 -- umorigu
- github.com:stefanpenner/es6-promise と github.com:github/fetch を使ってIE11でも動作するようにしてあります。(カスタマイズ対応) -- umorigu
- お疲れ様です。それぞれMITライセンスですが、(カスタマイズ対応)とある事からすると、それぞれをマージした先(述語)はこのサイト(のみ)ですか?それともPukiWikiのgitリポジトリもカスタマイズの対象ですか? -- henoheno
- 「それぞれをマージした先はこのサイト(のみ)ですか?」に対してYesになります。PukiWikiのリポジトリにはこれらのライブラリ(あるいはライブラリを参照するscriptタグ)を含みません。PukiWiki(Development Team; 配布者)としては「IE対応が必要な場合はサイト管理者が適宜Polyfillライブラリ利用のカスタマイズを行ってください」というスタンスになります。その上で、PukiWiki-devサイトは、IE対応するためにカスタマイズを行っている、という状態です。 -- umorigu
- 了解しました。仮にそれらがリポジトリや配布物に含まれる事になる場合、仮にそれぞれが別個の著作物として区別して取り扱うことができるように構成されているのであれば、フォルダ等でどこからどこまでが誰による著作物であるかを明確に区別できる構成が求められる事になるでしょう。(ここで触れているのはGPL ライセンスの著作物に MITライセンスの著作物をマージ可能である、というライセンスの話題よりも前の段階の話です) -- henoheno
- ありがとうございます。外部ライブラリを含めるときにはその辺りを意識して対応したいとおもいます -- umorigu
- 残件をすべて実装しました。完了とします commit:15e6dda251 -- umorigu
- BugTrack/2433 テキスト検索の時分割実行とキャンセル --