Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL或ElasticSearch/Solr是这类查询的合适工具吗?_Postgresql_Solr_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Full Text Search - Fatal编程技术网 elasticsearch,full-text-search,Postgresql,Solr,elasticsearch,Full Text Search" /> elasticsearch,full-text-search,Postgresql,Solr,elasticsearch,Full Text Search" />

PostgreSQL或ElasticSearch/Solr是这类查询的合适工具吗?

PostgreSQL或ElasticSearch/Solr是这类查询的合适工具吗?,postgresql,solr,elasticsearch,full-text-search,Postgresql,Solr,elasticsearch,Full Text Search,以下是当前PostgreSQL查询的示例: 选择一个.*,a.al_位置“(someLon,someLat)”作为d 来自al_应用程序。al_活动作为 WHERE to_tsvector('simple',a.al_关键字)@@to_tsquery('simple','someKeyword')) 订单按d偏移1000限制50; 基本上,它与定义如下的表格相对应: CREATE TABLE al_app.al_activity\u( al_id系列, al_类型int2不为空, al_时间戳

以下是当前PostgreSQL查询的示例:

选择一个.*,a.al_位置“(someLon,someLat)”作为d
来自al_应用程序。al_活动作为
WHERE to_tsvector('simple',a.al_关键字)@@to_tsquery('simple','someKeyword'))
订单按d偏移1000限制50;
基本上,它与定义如下的表格相对应:

CREATE TABLE al_app.al_activity\u(
al_id系列,
al_类型int2不为空,
al_时间戳时间戳不为空,
al_位置点不为空,
al_int4不为空,
al_关键字字符(1024)不为空,
约束al_id_pk主键(al_id)
);
查询可以按

  • 阿卢型
  • al_关键字
分类

  • 时间戳
  • 阿卢的受欢迎程度
  • 距离(用户位置和al_位置之间的距离,如上查询示例中计算)
所有查询均分页(每页50个活动)

我们在al_类型、al_时间戳和al_流行度上使用b树索引。我们还使用gist索引对al_位置和gin对to_向量(“简单”,al_关键字)。列al_关键字可能包含多语言文本和一些哈希标记

al_活动表包含600万行样本随机数据,但我们将在生产环境中处理数十亿行。我们注意到,每当我们增加查询中的偏移量以获得下一页时,查询时间就会越来越长。此外,我们不知道当表和索引的大小越来越大时(例如,使用分区表和部分索引),我们应该如何扩展


问题是:我们应该在PostgreSQL中优化这个查询,还是简单地切换到ElasticSearch/Solr之类的工具来完成这项工作?我们不会有任何问题,除非我们不确定它是否能解决我们的问题?

就您正在处理单个关系/表而言,我坚信Solr或Elasticsearch是最好的解决方案,因为您不需要额外的工作就可以获得一些很好的功能,例如和更多功能。SQL不能以同样的效率和简单性来处理这些特性


也就是说,如果您的部分需求是在多个关系上执行连接,那么您应该使用关系数据库执行这些操作,而Solr没有任何帮助。

Solr和Elasticsearch都能够轻松解决此问题,并且都将以更分散的方式解决此问题(就个人而言,我非常喜欢Elasticsearch,因为它是为这个目的预先设计的,并且它允许JSON,我发现它更干净)。PostgreSQL的好处在于,它能够提供与您使用的功能完全相同的额外功能,允许您在数据库中执行此操作,直到无法执行为止。我们的排序要求如何?Solr提供索引字段的排序,另请参见中的排序