在数据量非常大的情况下,排序不仅影响查询速度,而且占用系统资源。但如果本身存储的数据已经按照某个字段预先排序,检索性能会有明显提升,在大数据量上的对比尤为明显。因此,使用预排序功能够大幅度提升数据检索性能,优化搜索引擎的服务能力。本章节介绍使用预排序功能的操作步骤。

操作步骤

  1. 修改solrconfig.xml中的MergePolicy,具体请参见Customizing Merge Policies
  2. 查询时,指定参数segmentTerminateEarly=true即可,请参见以下demo演示:
    <mergePolicyFactory class="org.apache.solr.index.SortingMergePolicyFactory">
      <str name="sort">timestamp desc</str>
      <str name="wrapped.prefix">inner</str>
      <str name="inner.class">org.apache.solr.index.TieredMergePolicyFactory</str>
      <int name="inner.maxMergeAtOnce">10</int>
      <int name="inner.segmentsPerTier">10</int>
    </mergePolicyFactory> 

    此时插入数据将会按照timestamp字段进行预先倒序排序,执行查询如下:

    curl "http://localhost:8983/solr/testcollection/query?q=*:*&sort=timestamp+desc&rows=10&segmentTerminateEarly=true" 

    参数上加上segmentTerminateEarly=true后,显示效果会比没有设置预排序的快很多,尤其排序数据量到达T级别之后,效果更为明显。

    说明
    • 查询时,指定的sort必须与配置的MergePolicy中指定的一致,否则无效。
    • 查询时需要指定segmentTerminateEarly参数,否则会进行全排。
    • 使用了这个预排序返回的结果中,“numFound”是不准确的。