3

这是任务。我需要识别一个字符串是否包含某个城镇名称。另一个词 - 从一些文本中识别一个城镇。

作为输入,我有文本要搜索 AND 地理编码。根据从 db 加载的城镇地理编码列表。

现在,当前的实现是遍历这些城镇的列表,并尝试使用短路评估来匹配它。喜欢:

if (stripos($text, $currentTown) !== false && 
    preg_match("#\b$currentTown\b#i", $text)) {
    // add town to recognized list
}

问题是我有例如英国的城镇列表(大约 40 000),循环将花费“相当长的时间”。

所以我的问题是如何优化识别时间。也许数组中有一些高级搜索?

欢迎任何想法。

谢谢。

4

1 回答 1

0

虽然我最好的选择是立即使用“MySQL 全文搜索”,但我会尝试解决您的问题。我将尝试从“最佳结果”开始。

  1. 将所有城镇数据保留为小写(或至少在您搜索的位置)并$text = strtolower($text);在搜索前使用:这样您就可以使用strpos区分大小写的搜索 > 不敏感搜索

  2. 为什么要打扰 preg_match(); 就像你用 stripos 做 99% 一样的事情。你可以跳过它。

  3. 也许添加像 if strlen($text) < 4 这样的小检查,甚至不要尝试搜索,因为它会给出可怕的结果。

  4. 按长度排序您的数据(这是非常昂贵的,所以这样做一次并存储它)并跳过比输入短的 currentTowns。

  5. 按字母顺序排列您的数据,并且只通过与第一个字母(或第一个 + 第二个)匹配的部分

  6. 可能,缓存结果/搜索。然后你只需要搜索你的缓存,如果它可以找到一些行(但是你的缓存未命中很痛苦)

  7. 如果您有大型数据集,也许PHP Iterator 类可以提供帮助。它可以加快检查每条记录的过程。

于 2012-08-21T00:34:26.157 回答