php(模糊)搜索匹配

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

如果有人曾经向 digg 提交过故事,它会检查该故事是否已经提交,我假设是通过模糊搜索。

我想实现类似的东西,并想知道他们是否使用开源的 php 类?

Soundex 没有这样做,句子/字符串的长度最多可达 250 个字符

php mysql full-text-search
3个回答
7
投票

不幸的是,在 PHP 中执行此操作非常昂贵(CPU 和内存利用率很高。)但是,您当然可以将该算法应用于小型数据集。

具体扩展如何创建服务器崩溃:几个内置 PHP 函数将确定字符串之间的“距离”:levenshteinsimilar_text

虚拟数据:(假装它们是新闻标题)

$titles = <<< EOF
Apple
Apples
Orange
Oranges
Banana
EOF;

$标题=爆炸(“ ", $titles );

此时,$titles应该只是一个字符串数组。现在,创建一个矩阵并将每个标题与其他每个标题进行相似性比较。换句话说,对于 5 个头条新闻,您将得到一个 5 x 5 矩阵(25 个条目)。这就是 CPU 和内存接收器发挥作用的地方。

这就是为什么此方法(通过 PHP)无法应用于数千个条目。但如果你想:

$matches = array();
foreach( $titles 作为 $title ) {
    $matches[$title] = array();
    foreach( $titles 作为 $compare_to ) {
        $matches[$title][$compare_to] = levenshtein( $compare_to, $title );
    }
    asort( $matches[$title], SORT_NUMERIC );
}

此时,您基本上拥有的是一个具有“文本距离”的矩阵。从概念上看(不是在实际数据中),它看起来有点像下表。请注意,有一组 0 值对角线排列 - 这意味着在匹配循环中,两个相同的单词是 - 嗯,相同。

 苹果 苹果 橙子 橙子 香蕉
苹果 0 1 5 6 6
苹果 1 0 6 5 6
橙色 5 6 0 1 5
橙子 6 5 1 0 5
香蕉 6 6 5 5 0

实际的 $matches 数组看起来有点像这样(被截断):

数组
(
    [苹果] => 数组
        (
            [苹果] => 0
            [苹果] => 1
            [橙色] => 5
            [香蕉] => 6
            [橙子] => 6
        )

    [苹果] => 数组
        (
      ...

无论如何,由您(通过实验)确定一个好的数值距离截止值可能最匹配 - 然后应用它。否则,请阅读 sphinx-search 并使用它 - 因为它确实有 PHP 库。

橙色你很高兴你问了这个问题?


2
投票

我建议将用户提交的 URL 存储在多个部分中:域名、路径和查询字符串。使用 PHP parse_url() 函数导出提交的 URL 的各个部分。

至少索引域名和路径。然后,当新用户提交 URL 时,您将在数据库中搜索与域和路径匹配的记录。由于列已建立索引,因此您将首先过滤掉不在同一域中的所有记录,然后搜索剩余的记录。根据您的数据集,这应该比简单地索引整个 URL 更快。确保您的 WHERE 子句以正确的顺序设置。

如果这不能满足您的需求,我建议尝试 Sphinx。 Sphinx 是一个开源 SQL 全文搜索引擎,其速度远远快于 MySQL 内置的全文搜索。它支持词干提取和其他一些不错的功能。

http://sphinxsearch.com/

您还可以获取用户提交的标题或文本内容,通过函数运行它以生成关键字,并在数据库中搜索具有这些或类似关键字的现有记录。


1
投票

您可以(根据数据集的大小)使用 mySQL 的全文搜索,查找得分高且在特定时间范围内的项目,并向用户建议这个/这些。

更多关于分数的信息:MySQL全文搜索分数解释

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