tinybeans/bpsearch

bpsearch 核心脚本

1.4.0 2023-04-19 03:56 UTC

This package is auto-updated.

Last update: 2024-09-19 07:01:02 UTC


README

事前確認が良い

一般

  • 可以使用PHP吗?
  • 如果可以使用PHP,您可以从PHP中使用Linux的系统命令grep吗?(通常是可以的)
  • Vue.js对搜索结果的渲染非常有用。

在Movable Type的情况下

安装方法

将以下文件结构上传到网站的任意目录。

.
└── search
    ├── cache
    ├── data
    │   ├── all.json
    │   └── all.txt
    ├── bpSearch
    │   └── BPSearch.php
    └── search.php

data/all.json

data 目录中的 all.json 需要在 CMS 等中预先写入。

all.json 中应将 items 中的内容键作为键,将键值作为值写入,这些值包含过滤或搜索结果显示所需的信息。

{
  "items": {
    "e10": {
      "categoryId": "18",
      "categoryIds": [
        "18"
      ],
      "categoryLabel": "Events",
      "date": "13",
      "datetime": "20070813121308",
      "day": "月曜日",
      "excerpt": "(株)エムディエヌコーポレーションweb creators編集部が主宰する『Designer meets Designers 01』(以下「D2」)に参加してきました。...",
      "id": "10",
      "keywords": "CSS,セミナー,MDN",
      "month": "08",
      "tagIds": [
        "14",
        "70"
      ],
      "title": "Designer meets Designers 01",
      "url": "/blog/2007/08/designer-meets-designers-01.html",
      "year": "2007"
    },
    "e101": {
      "categoryId": "1",
      "categoryIds": [
        "1"
      ],
      "categoryLabel": "Diary",
      "date": "13",
      "datetime": "20080313055226",
      "day": "木曜日",
      "excerpt": "『ホップ本』といわれている(らしい)『実践 Web Standards Design』を買いました。 この本も、『Web標準の教科書』と同様、評価の高い本なので楽しみです。...",
      "id": "101",
      "keywords": "Web標準,ホップ本",
      "month": "03",
      "tagIds": [
        "39"
      ],
      "title": "「ホップ本」買いました",
      "url": "/blog/2008/03/post-14.html",
      "year": "2008"
    }
  }
}

data/all.txt

data 目录中的 all.txt 需要在 CMS 等中预先写入。

all.txt 中应将想要作为关键词搜索对象的文本,每行一个内容写入。

此外,在行首输入可以识别该内容的键,并用制表符分隔后继续写入关键词搜索目标的文本。

3608	303Movable Type 7 の管理画面で Data API v4 経由でコンテンツデータを更新するときにうまくいかずにハマった点を共有します091120181109111955MT 7 の管理画面で下記のように実行して 取扱店舗 というコンテンツデータフィールドの関連付けを削除したり変更したりしたかったのですがどうにもコンテンツデータが更新できませんでしたmtappVarsDataAPIgetToken(function () {  mtappVarsDataAPIgetContentData(31, 3, 3, function (cd) {    for (let i = 0; i  cddatalength; i++) {      if (cddata[i]label === 取扱店舗) {        cddata[i]data = [];      }    }    mtappVarsDataAPIupdateContentData(31, 3, 3, cd, function (newCd) {      consolewarn(newCd);    });  });});ここでPOST されたデータを見てみるとcontent_data: {author:{displayName:tinybeans,id:1,userpicUrl:null},basename:06bed0e01cb73fa5040e2e726f03de7335617791,blog:{id:31},createdDate:2018-10-26T11:14:03 09:00,data:[{\data\:[],\id\:\41\}],date:2018-10-19T06:51:14 09:00,id:3,label:桜並木を自宅で楽しめる歴史ある建築物件,modifiedDate:2018-11-09T02:04:40 09:00,status:Publish,unpublishedDate:null,updatable:true}更新したい部分だけ data:[{\data\:[],\id\:\41\}] のように値がオブジェクト全体が文字列になっていましたそこで下記のようにすべて文字列にしてから送信したら成功しましたmtappVarsDataAPIgetToken(function () {  mtappVarsDataAPIgetContentData(31, 3, 3, function (cd) {    for (let i = 0; i  cddatalength; i++) {      if (cddata[i]label === 取扱店舗) {        cddata[i]data = [];      }    }    const param = ObjecttoJSON(cd);    mtappVarsDataAPIupdateContentData(31, 3, 3, param, function (newCd) {      consolewarn(newCd);    });  });});結構な時間ハマったので共有しておきます以上ですMovable Type 7, Data API, コンテンツデータ金曜日blog20181109-111955html3608337100Data API v4 でコンテンツデータを更新するときにハマった管理画面Data API303307132018
3607	307Movable Type 7 に対応した MTAppjQuery v220 をリリースしました200920180920120751MTAppjQuery v220 をリリースしましたマルチフィールドが記事ウェブページでも利用可能にこのアップデートによりマルチフィールドが記事ウェブページでも利用できるようになりましたMovable Type 7 のブロックエディタは記事とウェブページでは利用できないのでぜひマルチフィールドの利用をご検討ください個人的にはMT 7 では記事ウェブページは利用せずにコンテンツデータに寄せていくのがいいと思っていたので初めは対応していませんでたが実際の現場ではまだ記事は頻繁に利用されているようですので今回対応させましたマルチフィールドが縦向きの固定テーブルに対応ご要望の多かった1列目が項目名2列目が入力欄で行を固定という縦向きの固定テーブルに対応しましたこれでこれまで重宝されてきた MTAppJSONTable はその役目を終え mtappmultiField を使っていくのが良いかなと思いますそのほか mtappmultiField で下記の対応を行いましたフィールドを追加 ボタンの表示・非表示を制御する showAddFieldButton オプションを追加保存データを表示 ボタンの表示・非表示を制御する showViewRawDataButton オプションを追加また MTAppAssetFields() を Movable Type 7 に対応しましたこのメソッドはプラグインの設定 で 旧バージョンのメソッド を 有効 にすることで利用できますダウンロードすでにライセンスをお持ちの方はサポートサイトの製品ダウンロードのページからダウンロードできます引き続きよろしくお願いいたします!MTAppjQuery, Movable Type, プラグイン, 管理画面, カスタマイズ木曜日blog20180920-120751html3607104221MTAppjQuery v220 リリース - マルチフィールドが記事・ウェブページに対応MTAppjQuery307132018

cache 目录

cache 目录应设置权限,以便PHP可以写入。

设置

通过更改 search.php$config 的值进行设置。设置的项及其内容请参考代码中的注释。

搜索条件设置

每个参数的搜索条件是在 search.php$configfilters 属性中设置的。此 filters 属性未设置的参数在搜索时将被忽略。

$config['filters'] 的设置是必需的。

可以设置的搜索条件如下。

  • eq : 完全匹配搜索(默认值)
  • like : 参数的值包含时命中
  • lt : 值小于参数时命中
  • le : 值小于或等于参数时命中
  • gt : 值大于参数时命中
  • ge : 值大于或等于参数时命中
  • not : 排除与参数一致的项目

传递给search.php的参数规范

search

执行关键词搜索(like搜索)。如果用半角空格分隔多个关键词传递,则进行 AND 搜索。

limit

指定要获取的项数上限。

offset

除了从开头指定的 offset 项外,返回结果。

rand

指定 rand=foo 时,如果搜索结果未达到 limit,则从包含 rand 参数值的文章中随机抽取以填充 limit 的数量。换句话说,需要预先在要随机获取的文章中设置 rand=['foo', 'bar'] 这样的数组。

例如,如果指定 rand=rel 以从指定搜索条件未满足的文章中随机获取并填充,则可以这样指定。

?rand=rel

cache

cache=1 的搜索结果的JSON将作为文件输出到 cache 目录。之后,如果存在缓存文件,则返回该文件的JSON。

cache 目录中的文件应通过cron定期删除,或通过CMS插件等删除。

其他键

用键值指定包含在JSON中的项目。

例如,获取ID为 123 的文章,请指定 id=123(完全匹配过滤器)。

获取值为空的文章请指定 foo=:empty:获取值不为空的文章请指定 foo=:notempty:

将多个值中的任何一个传递为参数,即成为 OR 条件的参数是数组。

?category[]=blog&category[]=news

关于其他键的搜索条件

关于搜索条件

请参考“设置”部分的“搜索条件设置”部分。

当参数和JSON的值都是数组时

如果是 tagsIds[]=111&tagsIds[]=222,则如果 tagsIds 包含 111222,则命中(OR 搜索)

JSON の値のサンプル

"tagIds": [ "111", "222", "333" ],

参数是数组,JSON的值是字符串时

如果是 categoryLabel[]=Blog&categoryLabel[]=News,则如果 categoryLabelBlogNews,则命中

JSON の値のサンプル

"categoryLabel": "Blog",

参数是字符串,JSON的值是数组时

如果JSON的值是数组,则 categoryIds=123 将命中

JSON の値のサンプル

"categoryIds": [ "123", "307", "333" ],

回调函数

定义回调函数时,请在 new BPSearch() 之前定义函数。

定义beforeResponse()的情况

function beforeResponse($result) {
    $timezone = 'Asia/Tokyo';
    $today = new DateTime('now', new DateTimeZone($timezone));

    foreach ($result['items'] as &$item) {
        $entryDate = new DateTime($item['datetimeIso8601'], new DateTimeZone($timezone));
        $diff = $entryDate->diff($today);
        $item['publishedBefore'] = $diff->days;
    }
    return $result;
}

$bpsearch = new BPSearch();

beforeResponse()

在返回响应之前执行。

参数

  • $result 将以数组的形式传递给参数,这些参数将在响应中输出。
$result = [
    'totalResults' => (the number of the items),
    'items' => [
        (array of an item)
    ]
];

返回值

  • 以数组的形式返回传递给参数的 $result

示例

function beforeResponse($result) {
    $timezone = 'Asia/Tokyo';
    $today = new DateTime('now', new DateTimeZone($timezone));

    foreach ($result['items'] as &$item) {
        $entryDate = new DateTime($item['datetimeIso8601'], new DateTimeZone($timezone));
        $diff = $entryDate->diff($today);
        $item['publishedBefore'] = $diff->days;
    }
    return $result;
}