表示不同类型事件(音乐会,足球比赛,慈善机构等)的SQL数据库,其中每个都包含与事件相关的数据(音乐会 – 艺术家姓名,匹配 – 主持人/访客团队).所有这些事件都继承自一个通用表事件,该事件包含与所有这些事件相关的数据(名称,描述,位置,开始/结束日期).
使用Hibernate或Doctrine中已知的每子类表来实现继承.数据库还存储event_concerts和event_football_matches表(通过FK)中使用的表artist(id,name,birth_date)和football_teams(id,name,country,coach_name). .
问题:
创建一个给出一些标准的搜索引擎({name:“manchester”,startDate:“01.01.2012 – 01.02.2012”}或{location:“london”,描述:“artists metallica -bieber”})将返回所有事件符合标准,以及艺术家/ 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英镑,07.11.2012
>(音乐家,不是活动)Neil Christian,1943 – 2012年,Rock’n’Roll主唱
如您所见,仅在事件发生时才考虑startDate(与事件相关的属性).
搜索引擎必须扫描很多表,这就是为什么我认为我应该使用专用软件(Sphinx,Lucene,……?)并为搜索创建单独的索引.
有谁能建议一些建立这样一个指数的解决方案?我可以使用什么软件作为该搜索引擎的基础?
编辑:
只是为了澄清:不需要任何属性.其中一些包含将使用完全匹配搜索的日期,其中一些包含也将使用完全匹配搜索的短文本(如位置).但其中一些包含很长的文本,需要以全文方式进行搜索.
我看到三种方法.>迁移到Couchdb.要进行位置开始时间搜索,请使用[location,event_start_time]作为键来构建视图.在搜索时,您可以使用?startkey = [“london,”05.11.2012“]& endkey = [”london“,”07.11.2012“]进行查询.要对描述启用全文搜索,请构建特定视图像this.
>建立ElasticSearch指数.您的示例中的搜索只是使用两个数据字段的结构化查询,其中位置是必须的,事件开始时间是范围. elasticsearch中的全文搜索功能更强大,您可以定义特定的analyzer来处理数据中的文本. Elasticsearch还支持使用地理空间数据进行搜索.
>使用Amazon CloudSearch.有一些已知的限制.我列出了一些我不喜欢的:
>文档大小小于1MB.
>在一个字段中最多可以指定100个值.
>不是开源的.
对于搜索实现之间的一些比较:
> Solr vs. ElasticSearch
> https://stackoverflow.com/questions/11115523/how-does-amazon-cloudsearch-compares-to-elasticsearch-solr-or-sphinx-in-terms-o
> http://www.searchenginecaffe.com/2012/04/amazon-cloudsearch-elastic-search-as.html