johnsnook/yii2-parsel

允许开发者提供一个类似于 Sphinx 的搜索查询界面

v1.0.0 2018-07-26 15:54 UTC

This package is not auto-updated.

Last update: 2024-09-26 16:58:06 UTC


README

允许开发者提供一个类似于 Google 或 Sphinx 搜索或其他全文搜索 (FTS) 引擎的布尔搜索查询界面。

示例结果

SELECT
  "ip", /* ip address */
  "visits", /* how many requests they've made */
  "city",
  "region"
FROM
/* A table similar to apaches access log.  See my extension yii2-ipFilter */
  "visitor"
WHERE
  (
    ("visitor"."ip" ILIKE '%georgia%')
    OR ("visitor"."city" ILIKE '%georgia%')
    OR ("visitor"."region" ILIKE '%georgia%')
  )
  AND ( /** marvel as we efortlessly generate a subquery */
    "ip" NOT IN (
      SELECT
        "ip"
      FROM
        "visitor"
      WHERE
        (
          ("visitor"."ip" ILIKE '%atlanta%')
          OR ("visitor"."city" ILIKE '%atlanta%')
          OR ("visitor"."region" ILIKE '%atlanta%')
        )
        OR (
          ("visitor"."ip" ILIKE '%decatur%')
          OR ("visitor"."city" ILIKE '%decatur%')
          OR ("visitor"."region" ILIKE '%decatur%')
        )
    )
  )

安装

首选的安装方式是通过 composer

运行

或添加

php composer.phar require --prefer-dist johnsnook/yii2-parsel "*"

到你的 composer.json 文件的 require 部分。

"johnsnook/yii2-parsel": "*"

使用

"看,我不知道我能说蟠蛇语言!我还有哪些不知道的关于自己的?看看。也许你能做点什么,哪怕是糟糕的,也不知道自己做了什么。"

一旦安装了扩展,只需在你的代码中通过

使用它

$userQuery = 'good AND plenty -licorice';
$parsel = new ParselQuery([
            'userQuery' => $this->userQuery,
            'dbQuery' => Script::find()
        ]);
$parsel->dbQuery->all();

标记/行为

要搜索的字段必须是当前文本、varchar 或 char。未来的版本可能会扩展到数字、日期,甚至可能是 JSON。所有搜索词(除非由全匹配操作符指定)都包裹在你的数据库选择的通配符中。搜索 "smart" 等同于 SQL 表达式 '%smart%'。搜索不区分大小写,只要你的数据库的 LIKE 操作符不区分大小写。PostgreSQL 将使用 ILIKE

连接词

'AND' 是默认行为。"smart pretty" 与 "smart AND pretty" 相同。

'OR' 允许查询有更多结果:"smart OR pretty"。

操作符

示例

查看 /examples 中的文件。如果仍然可用,你还可以在这里尝试一个示例 这里

其他阅读材料

PostgreSQL

使用 Trigrams 加速 PostgreSQL 搜索

优化数据库以进行模糊搜索

MySQL

MySQL 的 FULLTEXT 索引和 LIKE 查询的性能分析

致谢

本项目是在修改了优秀的 "Search Query Parser" 项目的基础上构建的。我简化了标记结构,并修改了解析器类,以更好地满足我的需求。他们的许可文件应位于本项目的根目录中。

这两个项目都是通过柏林的 Nikita Popov 的惊人快速 lexer 库 而得以实现的。阅读他关于这个主题的文章 这里