php/mysql:自定义站点搜索

2024-04-18

首先: - 我无法使用 sphinx,因为我使用共享托管 - 我不喜欢谷歌解决方案,即。自定义搜索有这些愚蠢的广告,而且网站搜索不是免费的

我想自己创建搜索机制。我有页面表,我想通过关键字搜索页面内容,在结果页面上我想显示与所需关键字匹配的部分文本(与谷歌一样)。

提前谢谢


那么你有两个(半)选择:

  • 使用MyISAM引擎来搜索你想要的数据
  • 编写你自己的索引
  • 更改托管或更改 DBMS(1/2 解决方案)

这是如何执行此操作的简短版本第二个选项:

假设您想要搜索文章的内容。 基本上,您必须为您可能想要搜索的所有单词创建一个索引。

下面的代码摘自书本SQL 反模式 http://pragprog.com/titles/bksqla/sql-antipatterns并且只修改了一点点。

我假设您想要索引文章:

CREATE TABLE Articles(
   article_id INT AUTO_INCREMENT,
   title VARCHAR(120),
   content TEXT,
   PRIMARY KEY ( article_id )
);

您需要一个关键字表(每个关键字可以在多篇文章中):

CREATE TABLE Keywords(
   keyword_id INT AUTO_INCREMENT,
   keyword VARCHAR(40) UNIQUE NOT NULL,
   PRIMARY KEY ( keyword_id )
);

现在要实现多对多关系的表:

CREATE TABLE ArticlesKeywords(
   keyword_id INT,
   article_id INT,
   PRIMARY KEY ( keyword_id , article_id ),
   FOREIGN KEY ( keyword_id ) REFERENCES Keywords( keyword_id ),
   FOREIGN KEY ( article_id ) REFERENCES Articles( article_id )
);

接下来,您创建一个存储过程,它填充您的索引机制:

CREATE PROCEDURE ArticlesSearch(keyword VARCHAR(40))
BEGIN
   SET @keyword = keyword;
   PREPARE s1 FROM 'SELECT MAX(keyword_id) INTO @k FROM Keywords
      WHERE keyword = ?';
   EXECUTE s1 USING @keyword;
   DEALLOCATE PREPARE s1;
   IF (@k IS NULL) THEN

      PREPARE s2 FROM 'INSERT INTO Keywords (keyword) VALUES (?)';
      EXECUTE s2 USING @keyword;
      DEALLOCATE PREPARE s2;

      SELECT LAST_INSERT_ID() INTO @k;

      PREPARE s3 FROM 'INSERT INTO ArticlesKeywords (article_id, keyword_id)
         SELECT article_id, ? FROM Articles
         WHERE title REGEXP CONCAT(''[[:<:]]'', ?, ''[[:>:]]'')
            OR content REGEXP CONCAT(''[[:<:]]'', ?, ''[[:>]]'')';
      EXECUTE s3 USING @k, @keyword, @keyword;
      DEALLOCATE PREPARE s3;

   END IF;

   PREPARE s4 FROM 'SELECT b.*FROM Articles b
      JOIN ArticlesKeywords k USING (article_id)
      WHERE k.keyword_id = ?';
   EXECUTE s4 USING @k;
   DEALLOCATE PREPARE s4;
END

现在您可以使用此过程在索引中搜索关键字。

CALL ArticlesSearch('OMG');

解决方案的最后一部分是确保每篇新文章都自动索引:

CREATE TRIGGER Articles_Insert AFTER INSERT ON Articles
FOR EACH ROW
BEGIN
   INSERT INTO ArticlesKeywords (article_id, keyword_id)
      SELECT NEW.article_id, k.keyword_id FROM Keywords k
      WHERE NEW.content REGEXP CONCAT('[[:<:]]', k.keyword, '[[:>:]]')
         OR NEW.title REGEXP CONCAT('[[:<:]]', k.keyword, '[[:>:]]');
END

.

附:我从来不需要测试这种方法,这就是为什么我不能保证它会起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

php/mysql:自定义站点搜索 的相关文章

  • 在 php 中将单词转换为数字 II

    这里有一个很棒的功能在 PHP 中将单词转换为数字 https stackoverflow com questions 1077600 converting words to numbers in php来自埃尔约博 但我有一个问题 字符串
  • Ioncube 编码的文件是否可以解码?

    我是一名 php 开发人员 我的客户计划分发一个使用 Php 开发的软件 计划使用 ioncube 或类似软件对文件进行编码 在谷歌搜索时 我发现很少有人解码这些文件 这些文件使用 ioncube 甚至其他软件进行编码 如果您询问是否可以破
  • 如何使用 php 将 base64 解码的图像保存在文件系统中?

    我通过向我的 Web 服务发出 POST 请求来获取 Base64 编码的 JPEG 字符串 我想解码它并将其保存在文件系统中 我如何使用 PHP 5 3 来实现这一点 我能够使用 base64 decode 函数成功解码数据 如何将此解码
  • 如何修复 Nginx 自动 301 重定向到带有尾部斜杠的相同 URL?

    当我尝试将 Web 应用程序的子目录中的索引文件访问到相同的 URL 但附加了斜杠 时 Nginx 出现了不良行为 它正在重新路由请求 我有一个简单的 Web 应用程序 其中设置了一个根目录和其中的许多子目录 每个子目录中都有一个 inde
  • mysqli::real_connect 和 new mysqli 对象在连接数据库方面有什么区别?

    我正在使用这种方法连接到mysql db this gt Con new mysqli this gt DB Server this gt DB User this gt DB Pass this gt DB DB 当我使用这种方法连接时有
  • Woocommerce 中的欧洲 GDPR 附加结帐验证复选框

    您好 我一直在尝试向我的 Woocommerce 结帐页面添加一个额外的条件复选框 该复选框与条款和条件相同 但包含有关新 GDPR 数据保护 的信息以及指向我的隐私政策的链接 他们必须在方框中打勾才能结帐 我一直在使用从此处找到的各种代码
  • 下拉 24 小时选项值和 12 小时显示

    我需要创建一个时间数组 以便在 HTML 下拉列表中使用 数组键应采用 24 小时格式 值应采用 12 小时制 包含 am 和 pm 在数据库中我想存储 24 小时格式 有没有一种快速的方法来创建数组而不是每小时键入 example 00
  • Woocommerce 获取产品

    我使用以下代码从我的 WordPress 网站中的 WooCommerce 获取产品类别列表
  • 如何在 MySQL Insert 语句中添加 where 子句?

    这不起作用 INSERT INTO users username password VALUES Jack 123 WHERE id 1 有什么想法如何通过 id 将插入范围缩小到特定行吗 在插入语句中 您不会有现有行来执行 where 语
  • 在 PHP 中添加分数会产生不同的结果[重复]

    这个问题在这里已经有答案了 可能的重复 PHP float 到 int 类型转换的意外结果 https stackoverflow com questions 3385685 php unexpected result of float t
  • proc_open() 失败并显示“权限被拒绝”

    我正在尝试使用proc open 执行程序并打印结果 但是 我不断收到 许可被拒绝 的消息 已将脚本和可执行文件的 chmod 设置为 0777 但无济于事 ini get safe mode 是假的 可能出什么问题了 我正在使用 Cent
  • foreach 循环中 current() 的意外行为[重复]

    这个问题在这里已经有答案了 这是一个简单的循环 list array A B C D foreach list as var print current list Output demo http 3v4l org sBDjl BBBB O
  • MVC和依赖注入,被迫使用单例Controller?

    我正在致力于构建一个根据 MVC 原则运行并利用依赖注入的 PHP 框架 我想我已经把前端控制器部分放下了 有一个工作路由器实例化控制器实例并根据请求的 URI 调用适当的操作 接下来是依赖注入 我想实现一个使用反射解决依赖关系的容器 这样
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 具有挑战性的问题 - 使用 PHP 对 XML 数据进行排序

    我有 xml 文件 其中包含大量产品数据 我需要根据我的字段 ProductRange 的数据对我的产品进行排序 ProductRange urldecode GET Range XML 文件数据
  • MySQL #1093 - 您无法在 FROM 子句中指定用于更新的目标表“赠品”

    I tried UPDATE giveaways SET winner 1 WHERE ID SELECT MAX ID FROM giveaways 但它给出了 1093 您无法指定目标表 赠品 进行更新FROM clause 本文 ht
  • 如何从 PHP 中的字符串创建可能的字符串组合?

    如何从 PHP 中的字符串创建可能的字符串组合 Exp input abc output array 0 gt a 1 gt ab 2 gt abc 3 gt ac 4 gt acb 5 gt b 6 gt ba 7 gt bac 8 gt
  • 我的设置未保存在 WordPress 主题选项页面中

    我正在尝试创建一个基于 WordPress 设置 API 的主题选项页面 当我在浏览器中检查 options php 页面时 例如http mysite com wordpress wp admin options php http mys
  • PHP strtotime() 未返回正确的月份

    由于当前月份 年份是 2012 年 1 月 为什么以下代码返回 2011 年 12 月而不是 2011 年 11 月 echo date F Y strtotime 2 months 如果有影响的话 这是在 PHP 5 3 0 上 要获得您
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它

随机推荐

  • 如何通过 SystemJs 在 Angular2 中使用时刻时区

    我正在使用 Angular2 通过Angular2 种子 https github com mgechev angular2 seed 使用 SystemJS 并尝试加载时刻时区 http momentjs com timezone doc
  • 使用片段共享过渡时返回过渡无法正常工作

    我有2个碎片ListMovieFragment and DetailMovieFragment 我有一个界面ListMovieFragment是在MainActivity 我正在使用共享元素转换 当我单击图像视图时ListMovieFrag
  • 有效地构建具有给定汉明距离的单词图

    我想从单词列表中构建一个图表汉明距离 https en wikipedia org wiki Hamming distance 比如说 1 或者换句话说 如果两个单词仅与一个字母不同 lol 假设您将字典存储在set 以便查找是O 1 平均
  • 在 Delphi 2009 中挂钩堆栈跟踪

    Delphi 2009 中的 Exception 类获得了许多新功能 其中许多与获取堆栈跟踪有关 property堆栈跟踪 string read获取堆栈跟踪 property堆栈信息 指针readFStackInfo 类变量获取异常堆栈信
  • Windows 上的 unbuffer 程序相当于什么?

    你好根据这个帖子 https unix stackexchange com a 25375 unbuffer通过伪终端 pty 连接到命令 这使得系统将其视为交互式进程 因此不使用任何 stdout 缓冲 我想在 Windows 上使用这个
  • 寻找 Maven 工件:Spring + Hibernate + JPA

    我是 Maven 新手 有以下 2 个关于 Maven 的问题 我正在寻找一个包含 Spring Hibernate JPA 的 Maven 工件 我发现的唯一一种是与 Flex 混合的 现在 我想保持简单 并且不想处理 Flex 增加的复
  • 范围过滤器不适用于“gt”运算符,但适用于“lt”

    我正在使用弹性搜索来索引我的文档 并希望根据特定属性过滤文档 这是我的代码 filter push range audience ethnicity asian gt 50 它不适用于 gt 运算符 发回不一致的结果 但适用于 lt 运算符
  • ChromeDriver 的默认位置以及在 Windows 上安装 Chrome 的默认位置是什么

    我需要安装chromedriver在 Windows 操作系统上 他们在下面的文章中指定 https sites google com a chromium org chromedriver getting started https si
  • Xcode 8 控制台垃圾? [复制]

    这个问题在这里已经有答案了 还有其他人遇到过 Xcode 8 控制台显示一堆随机内容的问题吗 我不想让所有这些弄乱我的调试消息和日志 有人知道如何关闭此功能吗 编辑 发行说明指定控制台可能会转储对 watchOS 无用的内容 但不适用于 i
  • MySQL - 如何诊断警告“中止连接 - (读取通信数据包超时)”的原因

    我在运行 MySQL 的相当繁忙的 Windows 2008 R2 Web 服务器上遇到了一些问题 应用程序间歇性崩溃 日志通常指向 MySQL 作为路由原因 因为应用程序无法连接到 MySQL 这并不会影响所有用户 只会影响一些不幸的用户
  • Oracle - 如何使用快速刷新和联接创建物化视图

    所以我很确定 Oracle 支持这一点 所以我不知道我做错了什么 这段代码的工作原理 CREATE MATERIALIZED VIEW MV Test NOLOGGING CACHE BUILD IMMEDIATE REFRESH FAST
  • 将svn迁移到git的子目录

    我想用 git 替换我的 svn 存储库 不幸的是 我无法一次性完成此操作 长话短说 我需要将带有历史记录的 svn 存储库移动到预先存在的 git 存储库的子目录中 所以我目前有 svn svn1 svn2 git git1 git gi
  • vscode jest 扩展无法正常工作

    我正在与VSCode并安装了扩大 Jest 为了更好的笑话测试环境 在扩展的指令中我看到我们得到了很好的智能感知支持对于杰斯特的命令 问题 我在底部栏上没有看到 Jest 图标 这意味着文本无法正常工作 我仍然没有得到对 jest 命令的智
  • 为什么绑定参数不指向实际的函数参数

    为什么 limit 是 20 而不是 el 20 因为在 isFullAge bind this 20 中 20 是最后一个参数 所以它必须传递给 el 参数 但为什么它被设置为 limit 参数 var years 1990 1965 1
  • 如何在 iPhone 中不使用 NSDictionary/NSMutableDictionary 中的 Key 来获取值?

    我有一个 Json 键和值方法 格式的 Web 服务响应 我解析并获取了最多的 Web 服务方法 但是 在一种网络服务方法中 我无法从键中获取值 我在这里附上示例响应 lessons ObjectiveC Book brief desc O
  • asp.net core 5.0 RequestSizeLimit 不起作用

    我正在使用 ASP net core 5 0 看起来RequestSizeLimit不管用 我有以下控制器 HttpPost addfile RequestSizeLimit 5 242 880 5MB public IActionResu
  • RAY Python 框架内存不足

    我用 ray 创建了一个简单的远程函数 它占用的内存很少 然而 运行一小段时间后 内存稳步增加 并且出现 RayOutOfMemoryError 异常 下面的代码是这个问题的一个非常简单的例子 result transformed nump
  • Django Admin:将多个管理类注册到同一模型

    是否可以将多个管理类注册到同一模型 我想让 PostAdmin 和 MyPostAdmin 都注册到 Post 模型 现在我正在尝试将代理模型与 MyPost 一起使用 但它在管理面板中为我提供了两个不同的模型 并且具有各自的功能 管理员
  • Firebase 通过函数写入 Firestore 时出错:“7 PERMISSION_DENIED:缺少或权限不足”

    我正在尝试编写一个简单的 Firebase 函数 使用 TypeScript 将记录添加到 Firestore 代码的精简版本是 import as admin from firebase admin import as functions
  • php/mysql:自定义站点搜索

    首先 我无法使用 sphinx 因为我使用共享托管 我不喜欢谷歌解决方案 即 自定义搜索有这些愚蠢的广告 而且网站搜索不是免费的 我想自己创建搜索机制 我有页面表 我想通过关键字搜索页面内容 在结果页面上我想显示与所需关键字匹配的部分文本