mySQL LIKE 全文查询

mySQL LIKE Query on Full Text

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

我并不是真的要进行全文搜索,而是进行一些接近的搜索。例如搜索 "Los Ang" 不应该只是 return "Los Angeles",还应该搜索 "East Los Angeles" - 但不应该搜索 "EastLos Angeles"(白色 space!)。

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

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

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

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

有什么聪明的方法可以在不转换为 myisam 的情况下优化它?

我不太关心写入性能,因为它主要是只读的table。

没有 MySQL 索引方法会让你 "East Los Angeles" 但不会 "EastLos Angeles",加上许多未说明的情况:"Dayton" 但不会 "Daytona Beach","Forest Hill" 但不是 "Forest Hills","Portland, ME" 但不是 "Portland, OR"。等等

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