了解更多Greenplum技术干货,欢迎访问Greenplum中文社区网站
Apache Solr是一款基于Apache Lucene的高效文本检索引擎,它具有容错性(fault tolerant),高可用(highly availability),易扩展(scalability),分布式(distribution)等特点,在世界上著名的大型应用和网站中被广泛使用,如eBay, Instagram, Netflix等。
GPText是 Greenplum生态系统的一部分。它无缝集成了Greenplum数据库海量数据并行处理以及Apache Solr企业级文本检索的能力,为用户提供了一套易于使用、功能完备的文本检索、分析方案。
在GPText的调优过程中,笔者发现Solr 7在返回大量搜索结果时,响应速度下降异常严重。经测试,笔者将性能瓶颈定位在Solr 7对DocValues的读取上,大量分析后,发现这是由于Solr 7不合理的DocValues读取机制导致的。
本文将会对Solr的DocValues进行介绍,并详解Solr 7/Solr 8中DocValues的读取机制,以及如何对其进行优化。在笔者的测试环境中,优化后的Solr 7响应速度可以提升10倍以上!
Solr的搜索
GPText的典型用例
在正式讲解solr的搜索过程前,笔者先简单介绍一下GPText的典型搜索用例。
假设我们有一张名为test的表,该表有两个字段,分别为id和content,如下:
我们事先对该表建立了一个索引,名为“demo.public.test”(备注2)。此时,若想搜索含有“VMware”关键词的记录,则可以调用如下语句(备注3):
select id from gptext.search(table(select 1 scatter by 1),
'demo.public.test', 'VMware', null);
结果如下:
此时,若想搜索同时含有“VMware”和“Your”这两个关键词的记录,则可以调用如下语句:
select id from gptext.search(table(select 1 scatter by 1),
'demo.public.test', 'Your AND VMware', null);
结果如下:
实际操作用例中,可能会将上述结果与原表“test”进行join以进行进一步分析。
备注1:https://lucene.apache.org/solr/
备注2:关于GPText的安装,索引的建立以及数据的导入,请参考https://gptext.docs.pivotal.io/340/welcome.html
备注3:关于gptext.search函数各个参数的意义,请参考https://gptext.docs.pivotal.io/340/topics/function_ref.html#topic85
Solr的搜索过程
在开始Solr的搜索过程前,我们需要先讲解两个概念:doc id和倒排索引。
Doc id是Solr为Solr中的每个文档(一个Solr的文档对应一条数据库的记录)所创建的一个内部标识符,该标识符是连续且唯一的。假设Solr中有10个文档,那么这10个文档的doc id就是0至9。Doc id与数据库中的主键功能类似,但与数据库的主键值未必相同。
以之前的test表为例,它在Solr中的存储是:
倒排索引(inverted index),是文档检索系统中最常用的索引方法,它存储了在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。在大部分的存储方式里,我们都是根据记录来查找属性。而倒排索引则相反,它是一种允许我们通过属性来查找记录的索引。
仍以之前的test表为例,我们为该表的content字段在Solr中建一个倒排索引,则该索引如下,