我的第一个想法是开始存储数据库中的每个单词而忽略具有2个或更少字符的单词,并且每次重复单词时只需将一个单词添加到计数器行(比如importance
)以首先出现在列表中常用搜索。听起来不错,直到你认为通常你搜索各种单词而不只是一个单词,例如:big house
,你可能希望将big house
存储为频繁搜索,而不是big
和{ {1}}。
我对如何做到这一点并做得有点困惑。有没有人做过类似的事情?您如何看待正确的方法呢?
答案 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。