zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    【转】CUDA5/CentOS6.4
    【转】centos 6.4 samba 安装配置
    【转】Install MATLAB 2013a on CentOS 6.4 x64 with mode silent
    【转】Getting xrdp to work on CentOS 6.4
    【VLFeat】使用matlab版本计算HOG
    Unofficial Windows Binaries for Python Extension Packages
    March 06th, 2018 Week 10th Tuesday
    March 05th, 2018 Week 10th Monday
    March 04th, 2018 Week 10th Sunday
    March 03rd, 2018 Week 9th Saturday
  • 原文地址:https://www.cnblogs.com/cxhfuujust/p/7754953.html
Copyright © 2011-2022 走看看