【发布时间】:2012-10-04 14:56:48
【问题描述】:
背景:
代表不同类型活动(音乐会、足球比赛、慈善募捐等)的 SQL 数据库,其中每个都包含与活动相关的数据(音乐会 - 艺术家姓名,比赛 - 主持人/观众团队)。所有这些事件都继承自一个通用表event,其中包含与所有事件相关的数据(名称、描述、位置、开始/结束日期)。
继承是使用从Hibernate 或Doctrine 已知的每个子类的表模型来实现的。该数据库还存储artists(id、name、birth_date)和football_teams(id、name、country、coach_name)和@9876543333@中使用的表@ 表(通过 FK)。
问题:
创建一个给定条件({name: "manchester", startDate: "01.01.2012 - 01.02.2012"} 或{location: "london", description: "artists +metallica -bieber"})的搜索引擎将返回所有符合条件的事件,以及来自artists/football_teams 表的结果。
这些事件的某些属性包含大量文本,应该以全文搜索的方式进行搜索。
示例:
根据以下搜索条件:
{ location: "london", startDate: "05.11.2012 - 07.11.2012" }
搜索引擎应该返回:
- (足球赛事)阿森纳 vs 曼联比赛,酋长球场,伦敦,06.11.2012
- (音乐会活动)Metallica 音乐会,Some-Fancy-Location,05.11.2012
- (足球队/非赛事)阿森纳,成立时间:1886 年,联赛:英超联赛
- (足球队/非赛事)切尔西,成立时间:1905 年,联赛:英超联赛
- (节日活动)伦敦万圣节,07.11.2012
- (舞蹈活动)Sadler's Wells 的睡美人,45 英镑,2012 年 11 月 7 日
- (音乐家,不是事件)尼尔·克里斯蒂安,1943 - 2012 年,摇滚歌手
如您所见,startDate(事件相关属性)仅在发生事件时才被考虑。
搜索引擎必须扫描很多表,这就是为什么我认为我应该使用专用软件(Sphinx、Lucene、...?)并为搜索创建单独的索引。
任何人都可以建议一些解决方案来构建这样的索引吗?我可以使用什么软件作为该搜索引擎的基础?
编辑:
澄清一下:这些属性都不是必需的。其中一些包含将使用精确匹配搜索的日期,其中一些包含也将使用精确匹配搜索的短文本(如位置)。但是其中一些包含很长的文本,需要以全文方式搜索。
【问题讨论】:
-
我没有看到你在哪里进行全文搜索,你给出的例子是完全匹配的。
-
@amirouche:你说得对,我没有给你一个合适的例子。假设 musician 有一个“biography”属性,其中包含大量文本。现在,对于以下条件:
{ phrase: "+royal musician", location: "london" }它应该返回位于伦敦的结果,其中musician.{name|biography}或football_team.{name|wiki}匹配(全文)+royal musician。
标签: performance search full-text-search