【问题标题】:Php array search optimizationphp数组搜索优化
【发布时间】:2012-08-15 19:29:53
【问题描述】:

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

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

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

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

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

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

欢迎提出任何想法。

谢谢。

【问题讨论】:

  • 这类似于DNA序列搜索问题。
  • 解决办法是什么?
  • 不会 sql LIKE 比你的 php sn-p 快吗?
  • 您可能会想,包含 40,000 个元素的数组可能不是最好的方法。我赞同使用数据库或服务解决方案的建议
  • 老实说我还没有考虑过这个解决方案。我将不得不彻底。需要使用 rlike 而不是 like 来匹配单词边界之间的城镇名称

标签: php arrays optimization


【解决方案1】:

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

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

  2. 何必用 preg_match();就像你用 stripos 做 99% 一样的事情。你可以跳过它。

  3. 也许添加一些小检查,例如 if strlen($text)

  4. 按长度对数据进行排序(这非常昂贵,因此只需执行一次并存储它)并跳过比输入短的 currentTowns。

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

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

  7. 如果您有大型数据集,PHP Iterator class 可能会有所帮助。它可以加快遍历每条记录的过程。

【讨论】:

    猜你喜欢
    • 2022-08-11
    • 2022-11-29
    • 1970-01-01
    • 2010-12-25
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    相关资源
    最近更新 更多