如何使用 PHP 在大文件中高效地执行“宽容”搜索?

问题描述 投票:0回答:1

我有一个包含超过 200.000 个条目的在线词典作为文件,可以在服务器上的 PHP 下运行良好。我想用 PHP 的“宽容”搜索选项来扩展它(类似于 Unix 下的 agrep)。这意味着我不仅想找到完全匹配的内容,而且(如果搜索查询失败)我还希望将类似的条目显示为包含错误字母或也有一个字母等搜索查询的结果任何职位上的人太多或太少。如何在不增加太多计算量的情况下用 PHP 高效地实现这一点呢?未压缩的源文件有几兆字节。

我尝试使用正则表达式,但很快就变得太大了。

关于数据结构:

每个条目与下一个条目之间用换行符分隔。

每个条目由两部分组成(德语部分和英语部分),用两个连续的冒号分隔。

两个部分中的每一个都可以有任意数量的子部分,子部分之间用垂直线分隔。

关于搜索:

可以双向(同时德语和英语)或单向(德语到英语或英语到德语)搜索。

您可以搜索整个单词或句子,也可以搜索单词的部分内容。

搜索时可以考虑或忽略大小写。

php search
1个回答
0
投票

问题似乎是数据结构太复杂,无法使用 levenshtein() 函数,因为条目不是唯一的,并且搜索字符串可能作为我想要比较的每个条目的整个字符串的一部分出现多次搜索查询。我需要的是类似函数 preg_match_levenshtein() 的东西。

我有一个想法来解决这个问题,方法是创建另外两个文件(一个英语和一个德语),其中仅包含两种语言的所有可能单词的唯一条目。如果搜索失败,我会将搜索字符串拆分为单个单词,并使用 levenshtein() 函数迭代搜索两个文件以查找匹配项或偏差距离。至少在两个文件之一中匹配的单词将从搜索字符串中删除,因为它们书写正确,并且可能不会导致搜索失败。剩余的单词被收集在一个数组中,以便使用 levenshtein() 进一步处理,最后显示建议,前提是 Levenshtein 距离不太大并且字母数量不低于最小值。

此方法只能用于拼写错误,但不适用于仅在搜索字符串中交换过的拼写正确的单词。

© www.soinside.com 2019 - 2024. All rights reserved.