solr学习四(关于性能的杂知识)

将所有只用于搜索的,而不需要作为结果的field(特别是一些比较大的field)的stored设置为false 
比如我们在solr中index了一篇word,对于这篇word,我们只需要这篇文章的下载地址,而不需要显示word的内容,并且这篇word又比较大。那么就不要stored了。(再仔细一点:我们已经用分析器将这篇word的内容索引了,能对其进行全文搜索了,那就不需要再存储这篇文章了) 

多值Field(Multi-valued Fields) 
比如一本书有多个作者,怎么办呢? 
一种方法是,添加多个同一key,不同value的Field 

  Document doc = new Document(); 
    for (int i = 0; i < authors.length; i++) { 
      doc.add(new Field(“author”, authors[i], 
                        Field.Store.YES, 
                        Field.Index.ANALYZED)); 
    } 

还一种方法是在一个field字段中存一个数组: 
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();  
docs.add(doc1);  
docs.add( doc2 );  
server.add(docs); 


对数字、日期、时间等进行索引 
索引数字 

有两种场景: 

1.数字嵌入在Text中,例如“Be sure to include Form 1099 in your tax return”,而你想要搜索1099这个词。此时需要选择不分解数字的Analyzer,例如WhitespaceAnalyzer或者StandardAnalyzer。而SimpleAnalyzer和StopAnalyzer会忽略数字,无法通过1099检出。 

2.数字式单独的Field,2.9之后,Lucene支持了数字类型,使用NumericField即可:doc.add(new NumericField(“price”).setDoubleValue(19.99));此时,对数字Field使用字典树存储, 

可向document中添加一样的NumericField数值,在NumericRangeQuery、NumericRangeFilter中以or的方式支持,但是排序中不支持。因此如果要排序,必须添加唯一的NumericField。 

precisionStep控制了扫描精度,越小越精确但速度越慢。 

索引日期和时间 

方法是:将日期转化为时间戳(长整数),然后按照NumericField进行处理。 

或者,如果不需要精确到毫秒,可以转化成秒处理 

  doc.add(new NumericField(“day”) .setIntValue((int) (new Date().getTime()/24/3600))); 

甚至对某一天进行索引而不是具体时间。 

    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    doc.add(new NumericField(“dayOfMonth”) 
            .setIntValue(cal.get(Calendar.DAY_OF_MONTH))); 


优化索引 
索引优化可以提升搜索速度,而非索引速度。它指的是将小索引文件合并成几个。 

IndexWriter提供了几个优化方法: 

optimize():将索引合并为一个段,完成前不会返回。但是太耗费资源。 

optimize(int maxNumSegments):部分优化,优化到最多maxNumSegments个段?是优化于上述极端情况的这种,例如5个。 

optimize(boolean doWait):通optimize(),但是它将立即返回。 

optimize(int maxNumSegments, boolean doWait):同optimize(int maxNumSegments),但是将立即返回。 

另外:在优化中会耗费大量的额外空间。即旧的废弃段直到IndexWriter.commit()之后才能被移除。 

理解索引过程 
总体来说,索引过程为: 

1.提取摘要:从原文提取,并创建Document和Field对象。Tika提供了PDF、Word等非文本的文本提取。 

2.分析:Analysis,首先对Document的Field进行分解,产生token流,然后经过一系列Filter(如小写化)等。 

3.建立索引:通过IndexWriter的addDocument写入到索引中。Lunece使用了反向索引,即“那个Document包含单词X”,而不是“Document包含哪些Word” 

索引文件组成 

为了保证效率,每个索引由若干segments组成: 

_X.cfs  每个segments由若干个cfs组成,X为0,1,2….如果开启了useCompoundFile,则只有一个.cfs文件。 

segments_<N>:记载每个分区对应的cfs文件。 

每个一段时间后,在调用IndexWriter时,会自动合并这些segment 

posted on 2017-10-30 16:10  cxhfuujust  阅读(162)  评论(0编辑  收藏  举报

导航