PHP(模糊)搜索的匹配

如果有人曾经提出一个故事,Digg的,它会检查这个故事是否已经提交,我想通过模糊搜索。

我想实现类似的东西,想知道,如果他们使用的是PHP类,它是开源的?

探测法心不是这样做,句子/字符串可最长为250chars

--------------解决方案-------------

不幸的是,在PHP这样做是极其昂贵(高CPU和内存利用率)。不过,你可以在一定的算法适用于较小的数据集。

要明确扩大了如何创建一个服务器崩溃:两个内置PHP函数将确定字符串之间的“距离”: 莱文斯坦similar_text。

伪数据:(假装他们是新闻标题)

$标题= <<< EOF
苹果
苹果

橙子
香蕉
EOF;

$标题=爆炸(“\ N”,$标题);

在这一点上,$标题应该只是一个字符串数组。 现在,创建一个矩阵,每个标题对所有其他的标题相似性比较。 换句话说,5头条新闻,你会得到一个5×5矩阵(25项)。这就是CPU和内存汇进去。

这就是为什么这种方法(通过PHP)不能施加到数千个条目。 但是,如果你想:

$匹配=阵列();
的foreach($标题为$标题){
$比赛[$标题=阵列();
的foreach($标题为$ compare_to){
$比赛[$标题] [$ compare_to] =莱文斯坦($ compare_to,$标题);
}
ASORT($比赛[$标题],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

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

排列

[苹果] =>阵列

[苹果] => 0
[苹果] => 1
[橙] => 5
[香蕉] => 6
[桔子] => 6

[苹果] =>阵列

...

总之,这是由你来(通过实验)确定一个好的数值距离截止可能主要是相匹配 - 然后应用它。 否则,读了狮身人面像搜索,并使用它 - 因为它确实有PHP库。

橙你很高兴你问这个?

我建议采取用户提交的URL并将其存储在多个部分; 域名,路径和查询字符串。 使用的PHP parse_url()函数以导出提交的URL的部分。

指数至少有域名和路径。 然后,当一个新的用户提交的URL搜索您的数据库中记录匹配的域和路径。 由于列索引,你将被过滤掉首先不在同一域记录,然后通过剩余的记录进行搜索。 根据您的数据集,这应该是更快,仅仅索引整个URL。 确保你的WHERE子句是建立在正确的顺序。

如果不能满足您的需求,我建议尝试狮身人面像。 斯芬克斯是一个开源SQL全文搜索引擎,远快是,MySQL内置的全文搜索。 它支持词干和其他一些不错的功能。

http://sphinxsearch.com/

你也可以把用户提交的标题或文本内容,通过函数运行它来生成关键字,并在数据库中搜索与这些或相似的关键字的现有记录。

你可以(根据您的数据集的大小)使用MySQL的全文检索,并寻找具有较高的分数,并在一定时间范围内,并建议该/这些用户项目(S)。

更多是here:http://stackoverflow.com/questions/230129/mysql-fulltext-search-score-explained

分类:php 时间:2012-06-28 人气:0
本文关键词: PHP,MySQL和全文检索
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.210 (s). 9 q(s)