gpt4 book ai didi

mySQL LIKE 全文查询

转载 作者:行者123 更新时间:2023-11-30 22:31:52 24 4
gpt4 key购买 nike

我正在尝试在具有几百万行的表中搜索城市名称。

我并不是真的要进行全文搜索,而是进行一些接近的搜索。例如,搜索“Los Ang”不应该只返回“Los Angeles”,还应该返回“East Los Angeles”——而不是“EastLos Angeles”(空白!)。

不幸的是,这需要类似这样的查询:

SELECT 
cities.name
FROM
cities
WHERE
(cities.name LIKE '% los angel%' OR cities.name LIKE 'los angel%') AND cities.country = 'US'
LIMIT 40

这将返回我预期的结果 - 但它需要大约 6 秒,这很糟糕。删除 LIKE '% los angel%' 子句会将查询缩短到 0.05 秒左右,但不会提供我正在寻找的完整结果。

在索引方面,在列 cities.name (varchar 200) 上有一个 B-TREE 索引。不能做全文索引,因为它是一个 innodb 表。

我可以在不转换为 myisam 的情况下优化它的任何聪明方法?

我不太关心写入性能,因为它主要是一个只读表。

最佳答案

没有任何 MySQL 索引方法会让您得到“East Los Angeles”而不是“EastLos Angeles”,以及许多未说明的情况:“Dayton”而不是“Daytona Beach”、“Forest Hill”而不是“Forest Hills”、“缅因州波特兰”而不是“俄勒冈州波特兰”。等等

但是,您可以结合使用 SQL 和应用程序代码。使用 FULLTEXT 索引搜索“Angeles”会非常快,然后应用程序代码可以处理它周围的内容。请注意,“Hill”可能与 FULLTEXT 中的“Hills”匹配,因此这将是另一件需要检查的事情。此外,还有一个最小“字长”;如果你不改变它,“Santa Fe Springs”中的“Fe”将被忽略。短名称(犹他州的“Roy”)可能是个问题。挪威有一个由 1 个字母组成的城市:“Å”。

关于mySQL LIKE 全文查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33677486/

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