上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。