gpt4 book ai didi

java - Mysql和Java搜索匹配多列中的多个值

转载 作者:行者123 更新时间:2023-11-29 12:40:34 25 4
gpt4 key购买 nike

我需要加快搜索速度。目前我们让用户输入一个名字:John Doe

然后在 Java 中,我们拆分该字符串以创建多个值(或“术语”)[“John”、“Doe”],并循环遍历提供的术语,在数据库中进行选择,在多个相关的术语中查找该术语栏目:

// For each term in the string[]
SELECT *
FROM Person p
WHERE 1=1
AND (p.idNumber = '#{term}'
OR LOWER(p.firstName) LIKE '%#{term}%'
OR LOWER(p.lastName) LIKE '%#{term}%'
OR LOWER(p.companyName) LIKE '%#{term}%'
OR p.phone = '#{term}');

在循环结束时,我们使用 Java 对匹配的行进行交集,以便所有匹配都是唯一的。

persons = (List<Person>)CollectionUtils.intersection(persons, tmpPersons);

我计划将其更改为动态 SQL 语句,以匹配一个 sql 语句中提供的所有术语并删除 CollectionUtils.intersection,但在完成该过程之前,是否有另一种方法可以实现更快的搜索?

最佳答案

您的搜索不能使用任何索引,这就是它很慢的原因。你正在做的是 fulltext search ,所以尝试使用现有的功能。

一些细节:

为什么不能使用索引?

  1. 您正在将列值转换为小写
  2. 您正在使用“%”+ ... 进行搜索

您不必要一次又一次地将每一行中的term转换为小写。

您可能从未听说过 SQL injection .

动态 SQL 有帮助吗?

可能是的,因为需要传输的数据更少,但更复杂的查询可能会给优化器带来问题。 Mysql 并不被认为是最聪明的。不管怎样,全文搜索要快得多,因为它使用索引。

如果全文搜索不能完全满足我的需要怎么办?

您可以尝试使用它来获取您想要的内容的超集并进一步过滤。

您可以尝试通过创建一个厨房水槽表来模仿它,其中包含所有可搜索文本,这些文本将由触发器更新,但这需要相当多的工作,而且您不会像引擎本身那样快。

关于java - Mysql和Java搜索匹配多列中的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26186258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com