介绍
在现代应用程序中,高效的文本搜索至关重要,尤其是在处理大型数据库时。虽然 MySQL 提供了基本的全文搜索功能,但在模糊匹配或处理拼写错误方面却存在不足。这就是基于三元组的搜索发挥作用的地方。在这篇博客中,我们将探讨什么是三元组、它如何提高搜索性能以及如何在 MySQL 中实现三元组搜索。
什么是卦象?
三元组是给定字符串中三个连续字符的序列。例如,单词“search”可以分解为以下三元组:
通过创建临时表在MySQL中实现三元组搜索
1.在MySQL数据库中创建Trigram函数。三卦函数代码:
CREATE FUNCTION TRIGRAM_SEARCH(search_string VARCHAR(255), target_string VARCHAR(255)) RETURNS FLOAT DETERMINISTIC BEGIN DECLARE i INT DEFAULT 1; DECLARE total_trigrams INT DEFAULT 0; DECLARE matched_trigrams INT DEFAULT 0; DECLARE search_length INT; DECLARE target_length INT; SET search_length = CHAR_LENGTH(search_string); SET target_length = CHAR_LENGTH(target_string); -- Handle edge cases where strings are too short IF search_length 0 THEN RETURN matched_trigrams / total_trigrams; ELSE RETURN 0; END IF; END;
2.现在将所需列索引为全文
@Entity() @Index(['title'], { fulltext: true }) export class Ebook extends BaseEntity { @PrimaryGeneratedColumn() ebookId: number; @Column({ nullable: true }) title: string; }
3.八字搜索功能测试
select * FROM ebook e WHERE TRIGRAM_SEARCH('physis onlu', e.title) > 0.4 ORDER BY TRIGRAM_SEARCH('physis onlu', e.title) desc;
4.在代码中实现三元组搜索
async find(title?: string) { const eBooks = await this.dataSource .getRepository(Ebook) .createQueryBuilder('eBook'); if (title) { eBooks.where(`TRIGRAM_SEARCH(:title, eBook.title) > 0.4`, { title }); } const result = await eBooks.getMany(); return result; }
结论
Trigram 搜索提供了一种在 MySQL 数据库中实现模糊匹配的强大方法。通过将文本分解为三元组,我们可以执行更灵活和更宽容的搜索,从而极大地增强文本搜索至关重要的应用程序中的用户体验。
虽然这种方法有其优点,但重要的是要根据您的具体用例和性能要求考虑 Levenshtein 距离或 soundex 算法等替代方案。
通过实施三元组搜索,您可以显着提高 Node.js 和 MySQL 应用程序的搜索能力,为用户提供更智能、更宽容的搜索结果。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3