自己动手写分布式搜索引擎
上QQ阅读APP看书,第一时间看更新

3.3.16 查询大容量索引

一般情况下,索引达到100GB以上,搜索的响应时间可能会增加到秒级。可以使用并发多索引查询来改进性能。

        /**
         * 并发多索引查询
         * @param index索引目录
         * @param q查询词
         * @return查询结果
         */
        public static Hits Multisearch(String[] index, String q) {
          int length = index.length;
          IndexSearcher[] is = new IndexSearcher[length];
          for ( int i = 0 ; i < length ; i ++){
              is[i] = new IndexSearcher(index[i]);
          }
          Searcher searcher = new ParallelMultiSearcher(is);
          Query query = QueryParser.parse(q, "temp", new StandardAnalyzer());
          Hits hits = searcher.search(query);
          return hits;
        }

ParallelMultiSearcher()把查询任务委托给多个IndexSearcher执行,也就是Searcher类把任务交给多个同类执行。

分布式计算参考http://www.spark-project.org。RDD是一个由分布在各个计算节点上的数据组成的不可变的数据集合,简单来说就是一个数据集。(参考https://github.com/zouzias/spark-lucenerdd)

固态硬盘读写速度比机械硬盘快,能够提高查找大容量索引的速度。机械硬盘在RAID 0阵列环境下使用也可以提高读写性能。通过玻璃中晶体和非晶体之间的相变来实现0和1之间的存储转变。

需要限制每个索引段最多只能存储21亿个独立的单词。超过此限制将会产生ArrayIndexOutOfBounds异常。

有些老师往往选学习成绩好的同学回答问题。把学习成绩好的同学调到前排,这样能更加方便地提问。分层索引就是为优质的文档开小灶,放在一个小索引中,其他的都放在大索引。

早期结束策略:如果完全执行查询耗时太长,则可以结束查询并估计结果。结束条件可以根据文档的数量或者增加时间来限制。为了让搜索结果的质量不会下降太多,可以对索引排序,把质量好的文档放在前面。

可以把Lucene的索引存到HBase。首先使用内存缓存,然后再同步缓存到HBase后端。在Hbase中创建两个表用来存储索引:Index表存储倒排索引,而Document表存储正排索引。HBase中存储数据的格式为Avro。