mysql词干分析
例如,用户可以搜索“testing”、“tested”或“tests”。所有这些词都是相互关联的,因为基本词“test”在所有这些词中都很常见。
有没有办法得到这样的结果或功能?

最佳答案

mysql全文搜索
历史上,myisam引擎支持全文搜索。在版本5.6之后,MySQL还支持在InnoDB存储引擎中进行全文搜索。这是一个好消息,因为它使开发人员能够受益于innodb的引用完整性、执行事务的能力和行级锁。
在mysql中,全文搜索基本上有两种方法:自然语言和布尔模式。(第三个选项使用第二个扩展查询扩展自然语言搜索。)
自然模式和布尔模式的主要区别在于布尔模式允许某些运算符作为搜索的一部分。例如,如果一个词在查询中的相关性大于其他词,或者某个特定词应该出现在结果中,则可以使用布尔运算符,等等。值得注意的是,在这两种情况下,搜索结果都可以按照mysql在搜索过程中计算的相关性进行排序。
最适合我们的问题是在布尔模式下使用innodb全文搜索。为什么?
我们几乎没有时间实现搜索功能。
在这一点上,我们没有大数据要处理,也没有大负载需要像elasticsearch或sphinx这样的东西。
我们使用的共享主机不支持ElasticSearch或Sphinx,硬件在这个阶段非常有限。
虽然我们希望在搜索函数中使用词干,但它并不能破坏我们的交易:我们可以通过一些简单的php编码和数据非规范化来实现它(在约束内)
布尔模式下的全文搜索可以搜索带有通配符的单词(用于词干分析)并根据相关性对结果进行排序。
在标准化的vertabelo模型中
让我们看看简单的搜索是如何工作的。我们将首先创建一个示例表:

CREATE TABLE artists (
         id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL,bio text NOT NULL, CONSTRAINT artists_pk PRIMARY KEY (id)
                    )ENGINE InnoDB;
CREATE  FULLTEXT INDEX artists_idx_1 ON artists (name);

自然语言模式
您可以插入一些示例数据并开始测试。(最好将其添加到示例数据集中。)例如,我们将尝试搜索michael jackson:
SELECT
    *
FROM
    artists
WHERE
    MATCH (artists.name) AGAINST ('Michael Jackson' IN NATURAL LANGUAGE MODE)

此查询将查找与搜索词匹配的记录,并按相关性对匹配的记录进行排序;匹配越好,相关性越强,结果将显示在列表中的位置越高。
在布尔模式下
我们可以在布尔模式下执行相同的搜索。如果我们不对查询应用任何运算符,唯一的区别是结果不会按相关性排序:
SELECT
    *
FROM
    artists
WHERE
    MATCH (artists.name) AGAINST ('Michael Jackson' IN BOOLEAN MODE)

布尔模式下的通配符运算符
因为我们要搜索词干和部分单词,所以需要通配符(*)。此运算符可用于布尔模式搜索,这就是我们选择该模式的原因。
所以,让我们释放布尔搜索的力量,尝试搜索艺术家的部分名字。我们将使用通配符运算符来匹配任何名称以“mich”开头的艺术家:
SELECT
    *
FROM
    artists
WHERE
    MATCH (name) AGAINST ('Mich*' IN BOOLEAN MODE)

09-10 07:55
查看更多