使用lucene实现社会化搜索
百度百科上对社会化搜索的定义是“社会化搜索的意思就是通过搜索形成一个有共同爱好的人际圈子,又通过搜索每个人的爱好和收藏为用户提供一个更为准确的信息。”前半句说明社会化搜索一定依附于某一个社交平台,有平台才能形成圈子,才能有社交数据来作为社会化搜索的基础;后半句更确切的说,就是个性化搜索,根据用户个性化数据来调整排序的规则,所以不同的人会看到不同的内容。
社会化搜索按照功能可以划分为“过滤”搜索和“加权”搜索。
- 过滤搜索:用户可以通过设定规则来过滤搜索结果,比如facebook的搜索朋友的页面,可以选择好友,城市,居住地来作为过滤条件,筛选出目标。
- 加权搜索:这一项很难让察觉到,因为它只改变条目的分数,进而调整排序,google就对google+的内容进行了加权,据说和“+1”有关。
上面的功能都能通过lucene来实现,而且并不复杂。其实在stackoverflow上已经有了不错的解答,排在第二的答案的解决方式更漂亮一些:社会化数据存储在索引外,继承lucene的CustomScoreQuery载入社会化数据实现搜索功能。社会化数据储存在索引外有三个优点:
- 数据变动频繁,如果存放在索引内部会频繁的更新索引,会更快的遇到性能瓶颈。
- 具有更强的描述能力(neo4j是个很好的选择,不过数据量小的情况下key-value数据库也可以),比如,可以搜索好友的动态,好友的好友,好友的好友的动态,而放到索引中只能完成单一的功能,需求变化了还要索引新的数据,索引的体积会程几何倍增长。
- 功能解耦,易于调试。