我正在研究为我参与的项目选择搜索服务器的不同选项。搜索服务器用于在Rails中构建的约会网站上提供结果,其中搜索提供所有'匹配“-Magic。
典型的查询将涉及使用表达式(伪代码)对文档/结果进行排名:
默认情况下,我不需要大多数搜索服务器的全文功能,而且我不需要检索完整的文档 - 只需要一个唯一的ID。
具有以下属性的搜索服务器的项目性质:
我找到了Sphinx,Solr和ElasticSearch,但所有这些(据我所见)都是为全文搜索而构建和优化的,ES和Solr都建立在Lucene上,我不知道是什么最适合过滤/属性重度搜索。
我的问题:
答案 0 :(得分:5)
不了解其他人,但Solr可以做到这一切:
空间排名
你需要一个nightly build of Solr(撰写本文时最新的稳定版本,Solr 1.4.1,不包括此功能),据我所知这是一个非常稳定的主干功能。
基于自定义函数的结果排名
Solr有很多function queries来进行助推。
属性过滤器
这是一种常见的搜索功能。
可扩展且快速
Lots of big websites正在使用Solr,证明了它的可扩展性和速度。
免
Solr is Apache licensed,非常宽松的许可证。
答案 1 :(得分:4)
ElasticSearch也具备所有这些功能。
支持各种语言的地理距离/边界框/多边形和自定义得分脚本: http://www.elasticsearch.com/docs/elasticsearch/rest_api/query_dsl/
您对过滤器或其他查询类型的性能没有任何问题,我们在某些情况下对100多个属性的查询进行大量过滤,而且速度很快。
要考虑的另一件事是与数据存储的集成。 ES有一个很好的River功能,但它与所有数据存储都不兼容,但类似的可以通过post commit hooks来实现。
此外,社交网站受益于(近)实时搜索,ElasticSearch默认为1秒。配置和扩展比Solr更干净。这是我对每个应用程序经过一个月的评估后的看法。它还可以很好地适应您的数据模型。
希望这有帮助。
保
答案 2 :(得分:1)
你不是在谈论搜索引擎。你在谈论数据库。在SQL中,过滤是标准的SELECT东西;排名可以通过一个涉及大量CASE,然后是ORDER BY的一些狡猾的表达来完成。
要执行查询的空间部分,您需要一个具有地理空间特征的数据库。
具有地理空间功能的唯一可扩展,快速,免费的关系数据库是PostgreSQL。
答案 3 :(得分:0)
我认为,当你可以使用像Solr或ES这样的搜索引擎来支持这一点时,我认为你定义的“业务规则”意味着你最终会做后期处理。
我认为过滤和基本搜索很容易在您的搜索引擎中完成,但我猜测排序逻辑最终会变得非常自定义和复杂,并且尝试将其推送到您的搜索查询中可能就像将一个圆形挂钩放在一个方孔中...你可能最好不要查询结果,然后使用你自己的后处理器规则库来处理订购。