背景:
代表不同类型事件(音乐会、足球比赛、慈善收藏等)的 SQL 数据库,其中每个都包含与事件相关的数据(音乐会 - 艺术家姓名,比赛 - 主持人/访客团队)。所有这些事件都继承自一个通用表event
,其中包含与所有事件相关的数据(名称、描述、位置、开始/结束日期)。继承是使用从Hibernate或Doctrine已知的 table-per-subclass 模型实现的。数据库还存储在和表中使用的表artists
(id
、name
、birth_date
)和football_teams
(id
、name
、country
、 ) (通过 FK)。coach_name
event_concerts
event_football_matches
问题:
创建一个给定条件({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" }
搜索引擎应返回:
- (足球赛事)阿森纳对曼联的比赛,酋长球场,伦敦,2012 年 11 月 6 日
- (音乐会活动)Metallica 音乐会,Some-Fancy-Location,05.11.2012
- (足球队/非赛事)阿森纳,成立时间:1886 年,联赛:英超联赛
- (足球队/非赛事)切尔西,成立时间:1905 年,联赛:英超联赛
- (节日活动)伦敦万圣节,07.11.2012
- (舞蹈活动)Sadler's Wells 的睡美人,45 英镑,2012 年 11 月 7 日
- (音乐家,不是事件)尼尔·克里斯蒂安,1943 - 2012,摇滚歌手
如您所见,仅在发生事件时才考虑startDate(与事件相关的属性)。
搜索引擎必须扫描大量表,这就是为什么我认为我应该使用专用软件(Sphinx、Lucene、...?)并为搜索创建单独的索引。
任何人都可以建议一些解决方案来构建这样一个索引吗?我可以使用什么软件作为该搜索引擎的基础?
编辑:
只是为了澄清:不需要任何属性。其中一些包含将使用精确匹配搜索的日期,其中一些包含也将使用精确匹配搜索的短文本(如位置)。但其中一些包含长文本,需要以全文方式搜索。