这是任务。 我需要识别一个字符串是否包含一些城镇名称。 换句话说 - 从一些文本中识别出一个城镇。
作为输入,我有文本进行搜索和地理编码。 根据地理编码,城镇列表从数据库中加载。
现在,当前的实现是循环遍历这些城镇的列表,并尝试将其与短路评估的使用相匹配。 喜欢:
if (stripos($text, $currentTown) !== false &&
preg_match("#\b$currentTown\b#i", $text)) {
// add town to recognized list
}
问题是我有,例如英国的城镇列表(大约 40 000)循环将花费“相当长的时间”。
所以我的问题是如何优化识别时间。 也许数组中有一些高级搜索?
欢迎提出任何想法。
谢谢。
最佳答案
虽然我最好的选择是立即使用 'MySQL full text search'我会尝试解决你的问题。我将尝试从“最佳结果”开始。
将所有城镇数据保持小写(或至少在您搜索的位置)并在搜索前使用
$text = strtolower($text);
:这样您就可以使用strpos
区分大小写的搜索 > 不区分大小写的搜索何必用 preg_match();因为你用 stripos 做了 99% 相同的事情。你可以跳过它。
也许添加一些小检查,例如 if strlen($text) < 4 甚至不要尝试搜索,因为它会给出可怕的结果。
按长度排序您的数据(这非常昂贵,因此执行一次并存储它)并跳过比输入短的当前城镇。
按字母顺序排列您的数据,只浏览与第一个字母(或第一个 + 第二个字母)匹配的部分
可能会缓存结果/搜索。然后你只需要搜索你的缓存,如果它能找到一些行(但是你的缓存错过伤害)
如果您有大型数据集,可能是 PHP Iterator class可以帮忙。它可以加快遍历每条记录的过程。
关于Php数组搜索优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12038154/