我想在我的网站上添加一个搜索字段。该站点基于PHP和Yii框架。 Web服务器在提供生成的Web页面之前汇集了多个数据(来自文件和API)(Web服务器迟早会从MySQL数据库中获取这些数据,但它现在只是文件,而API结果)。
Apache的Lucene可以解决这个问题,但是没有办法在服务器上使用Java - 我在共享的Linux主机上。
谷歌网站搜索(或bing's,..)可以解决问题,但我希望有一个完全可自定义的搜索框,并为提议的结果添加一些结果。
我可以创建自己的搜索引擎,索引页面并根据每个数据的来源使用不同的权重,以获得精确的结果;但我认为必须有一些更高效,更快速实施的东西。
在不使用Java或Google网站搜索的情况下,为基于PHP的网站添加快速搜索功能的方法是什么?
答案 0 :(得分:3)
我使用Zend Framework,因此Zend_Search_Lucene。它是分面搜索的纯PHP实现。您可以相对直接地定义自己的“文档”(作为数据的集合),权重轴和构建索引。根据我的经验,缺点是它在索引和查询方面要比(例如)solr慢得多。
更新1 在回复评论时,这里有一个链接:how I use Zend_Search_Lucene for spatial searches。那里的代码演示了一些事情:
更新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%'
")