如何在不使用Java或Google网站搜索的情况下将搜索功能添加到PHP网站?

时间:2013-11-05 20:46:12

标签: php search yii

我想在我的网站上添加一个搜索字段。该站点基于PHP和Yii框架。 Web服务器在提供生成的Web页面之前汇集了多个数据(来自文件和API)(Web服务器迟早会从MySQL数据库中获取这些数据,但它现在只是文件,而API结果)。

Apache的Lucene可以解决这个问题,但是没有办法在服务器上使用Java - 我在共享的Linux主机上。

谷歌网站搜索(或bing's,..)可以解决问题,但我希望有一个完全可自定义的搜索框,并为提议的结果添加一些结果。

我可以创建自己的搜索引擎,索引页面并根据每个数据的来源使用不同的权重,以获得精确的结果;但我认为必须有一些更高效,更快速实施的东西。

在不使用Java或Google网站搜索的情况下,为基于PHP的网站添加快速搜索功能的方法是什么?

3 个答案:

答案 0 :(得分:3)

我使用Zend Framework,因此Zend_Search_Lucene。它是分面搜索的纯PHP实现。您可以相对直接地定义自己的“文档”(作为数据的集合),权重轴和构建索引。根据我的经验,缺点是它在索引和查询方面要比(例如)solr慢得多。

更新1 在回复评论时,这里有一个链接:how I use Zend_Search_Lucene for spatial searches。那里的代码演示了一些事情:

  • 第54-62行显示了如何向索引添加“文档”。在这个例子中,文档只有两个字段(经度和纬度),但你明白了。只需将其放入循环中并将文档添加到索引中即可。在生产操作中,我会跟踪数据的更改,并在进入索引文档的任何数据发生更改时更新索引。初始导入非常慢 - 根据经验,我发现该算法至少为O(n log n)且K值非常大,而solr更像是O(log n)。
  • 第42-52行显示了如何搜索索引。这种搜索比平常要复杂一些,因为我必须以与索引中编码相同的方式编码经度和纬度。文章解释为什么必须要完成,但足以说:如果你只有文本数据,索引搜索就不那么难了。
  • 第40行正在创建索引,前两个项目符号中提到的“添加”和“搜索”都需要。请注意,将索引保持在快速介质(如SD存储)上会降低算法中的K,但它仍然(根据经验,不是分析)O(n log n)。
  • 第1-38行是将经度和纬度标准化为Zend_Search_Lucene支持的格式所需的帮助程序。同样,如果您只有文本数据,则不需要这种复杂功能。

更新2 响应有关效果的评论。将索引放在快速介质(SD,RAM磁盘w / sync,无论如何)上可以加快速度。使用unstored字段也有一点帮助。这两个都减少了经验O(n log n)中的常数,但仍然主要的问题是n乘数。 Zend似乎要做的是,在每次添加时,重新洗牌大部分或全部先前添加到索引中。据我所知,这是索引构建过程中的算法,无法修改。

我绕过那个n乘数的方法是使用基于词干查询的Zend Page Cache(所以如果有人输入“蓝莓”,“蓝莓”,“蓝莓”,“蓝色”等等)他们都被扼杀并固定在soundex拼音“blue-bear-ee”上。常见查询几乎可以获得即时结果,并且由于特定域是读取繁重且插入潜在的,因此这是可接受的解决方案。显然,一般情况下并非如此。

在其他情况下,有setResultSetLimit() method,与评分一起使用时,会更快地返回结果。如果你不关心所有可能的结果,只有前N个结果,那么这就是你要走的路。

最后,所有这些经验都与Zend 1.x有关。我不知道这是否已在2.x中解决。

答案 1 :(得分:2)

搜索引擎很多。我个人喜欢Sphinx Search。但您需要能够在您的(或远程)服务器上编译和运行它。 You can look on php based search engines就像seekquarry

一样

答案 2 :(得分:0)

您需要在数据库中拥有所有数据(页面名称和URL),而不是在MySql查询中使用LIKE运算符创建搜索功能:

mysql_query("
SELECT *
FROM `table`
WHERE name LIKE '%keyword%'
")