如何制作“频繁搜索”引擎?

时间:2010-08-27 09:36:07

标签: php codeigniter search-engine

我的第一个想法是开始存储数据库中的每个单词而忽略具有2个或更少字符的单词,并且每次重复单词时只需将一个单词添加到计数器行(比如importance)以首先出现在列表中常用搜索。听起来不错,直到你认为通常你搜索各种单词而不只是一个单词,例如:big house,你可能希望将big house存储为频繁搜索,而不是big和{ {1}}。

我对如何做到这一点并做得有点困惑。有没有人做过类似的事情?您如何看待正确的方法呢?

3 个答案:

答案 0 :(得分:2)

我的回答并不包含算法模式,而是你可以追求的行为模式。

打开一些搜索记录一段时间。(ppl正在搜索的内容)

记录哪些是成功的搜索,哪些是实际找到结果(找到的结果)。

您可以通过捕获用户在搜索字词时实际点击的资源来改进这一想法。

这会给你: 人们搜索的内容以及他们可能意味着什么。

继续使用,然后使用时态数据进行优化:“在周末,人们会搜索这个”

这将有助于构建您的搜索使用方式的图片,并使您能够“拦截”搜索字词并插入“您的意思是什么?”风格搜索助手,并在您的主页“一年中的这个时候流行”搜索链接。

所以,最初是一个搜索表来捕捉正在发生的事情:

term | results_cnt | daydate | session

然后,当那里有一些数据时,将短语分组,寻找模式,存根单个单词 - 但是我说要正确地做这个你需要有一些人为输入,但这一切都取决于大小和您网站的主题。

答案 1 :(得分:1)

嗯,我会创建2个表

搜索 SearchFrequency

搜索将包含所有搜索,搜索频率将是已重复搜索的列表,因此它将如此显示

------------------------------------------------------
frequency_id     frequency_sid     frequency_counter
------------------------------------------------------
1                3                 33
2                56                66
3                33                128
.....

然后你可以做

SELECT * FROM Searches,SearchFrequency WHERE search_id = frequency_sid ORDER BY frequency_counter DESC LIMIT 30

然后只更新表格,

id = INSERT INTO Searches ....
INSERT INTO SearchFrequency (frequency_sid,frequency_counter) VALUES (id,frequency_counter + 1);

这样可以更新两个表格,然后您还可以使用IP,相关搜索等跟踪个别搜索。

然后,您还可以设置 SearchKeywordsFrequency 表,以便您可以展开搜索并存储单个字词,然后创建多对多关系使用 SearchFrequency

答案 2 :(得分:1)

您需要在索引或数据库中存储完整的关键字(我建议您使用具有非常灵活的API的Zend_Lucene或Swish等索引)。然后,您必须应用邻近搜索,即查找两个或更多关键字在特定距离内的搜索。 Zend Lucene和swish已经建立了一些方法,可以在应用邻近搜索后根据他们的排名给出排序结果。

Zend_search_Lucene文档列于此处http://framework.zend.com/manual/en/zend.search.lucene.html。如果您需要实施细节,请随时询问。

Swish可以作为separate module使用,可以通过CMD运行,也可以php extension使用。

此外,如果您想要自定义Proximity算法,那么您可以查看其wiki以获取详细信息http://en.wikipedia.org/wiki/Proximity_search_%28text%29

<强>编辑: 如果您要使用数据库解决方案,那么您可以创建应用您自己的Proximity搜索算法实现的函数,以获取最佳相关搜索。你还应该看看mySql Full-Text Searching