一尘不染

如何使用php和mySQL实现简单的站点搜索?

mysql

我正在创建一个允许用户提交报价的网站。如何创建返回最相关引号的(相对简单?)搜索?

例如,如果搜索词是“土耳其”,那么我将返回引号,其中单词“土耳其”出现两次,而引号则只出现一次。

(我会添加一些其他规则来帮助过滤掉不相关的结果,但是我主要担心的是。)


阅读 291

收藏
2020-05-17

共1个答案

一尘不染

每个人都建议使用MySQL全文搜索,但是您应该注意一个巨大的警告。全文搜索引擎仅适用于MyISAM引擎(不适用于InnoDB,因其参照完整性和ACID兼容性,它是最常用的引擎)。

因此,您有几种选择:

1. 最简单的方法由“ 粒子树”概述。您可以从纯SQL中获得排名搜索(没有全文,没有任何内容)。下面的SQL查询将搜索一个表,并根据搜索字段中出现的字符串数对结果进行排名:

SELECT
    SUM(((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'term', '')))/4) +
        ((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'search', '')))/6))
    AS Occurrences
FROM
    posts AS p
GROUP BY
    p.id
ORDER BY
    Occurrences DESC

编辑了他们的示例以提供更多的清晰度

上面的SQL查询的变体,添加WHERE语句(WHERE p.body LIKE’%whatever%you%want’)等,可能会完全满足您的需求。

2. 您可以更改数据库架构以支持全文。无需安装Sphinx Fulltext Search
Engine
for
MySQL之类的插件来保持InnoDB引用完整性,ACID遵从性和速度的通常做法是将报价数据拆分到其自己的表中。基本上,您将有一个Quotes表,它是一个InnoDB表,而不是您的TEXT字段为“
data”,而是具有引用“
quote_data_id”,该引用指向Quote_Data表(即MyISAM表)上的ID。您可以在MyISAM表上使用全文本,将InnoDB表返回的ID合并在一起,然后就可以得到结果。

3. 安装Sphinx。祝你好运。

鉴于您的描述,我 强烈
建议您采用我介绍的第一种方法,因为您有一个简单的数据库驱动站点。第一种解决方案很简单,可以快速完成工作。Lucene将非常麻烦地进行设置,尤其是当您要将Lucene与数据库集成时,Lucene的主要目的是索引文件而不是数据库。Google自定义站点搜索只会使您的站点失去大量声誉(使您看起来很业余和被黑),而MySQL全文很可能会导致您更改数据库架构。

2020-05-17