终于认真一次了,写一下最近学习solr和lucene遇到的一些小知识点:

    首先说一下lucene,solr的奠基石,都说solr是对lucene的封装,在这我们也就这么想吧,但是并不是简单的封装,说深了,我也不理解,也是个小菜鸟一个。我现在用lucene主要是为大数据建立起索引,然后查询。

    当然,在建立索引的过程中也有好多需要我们这些小菜鸟关注的,也许一开始的时候大家都不是很关心这些细节。

    1、field是否存储。

   
   
   
   
  1. Document doc = new Document(); 
  2. doc.add(new Field(fieldname,map.fieldvalue,Store.NO,Index.NOT_ANALYZED)); 

   我敢打赌,初学的朋友都会选择Store.Yes,但是很多情况,很多需求是不允许我们这么做的,例如现在有一个很大很大的大数据,直观的例子,几十G的大文件甚至更大,我们现在要对每行数据进行处理,分割,建立索引,如果这边我们采用Store.YESde 话,那么可以想象,代价是多么昂贵,那么你的索引完全可能是你源数据的好几倍,这样就违背了我们建索引的初衷,所以这里要合理选择。

   假如大家的习惯都比较好,处理的很合理,那么又有一个问题来了,如果我们要对这些Field进行查询怎么办,或许有人会说了,那就用IndexSearch查询呗(不考虑老鸟的存在),不就是:

   
   
   
   
  1. IndexSearch inSearcher = new IndexSearcher(FSDirectory.getDirectory(new File( 
  2.                     indexPath))); 
  3. TopDocs tDocs = inSearcher.search(query, 1); 
  4. scoreDocs = tDocs.scoreDocs; 
  5. for (ScoreDoc sDoc : scoreDocs) { 
  6.    System.out.println(inSearcher.doc(sDoc.doc).get(fieldname)); 
  7.   } 
  8. int total = tDocs.totalHits; 
  9. inSearcher.close(); 

   但是,确实是这样吗,查询结果又是什么呢,想必是空吧,也就是null,因为你没有存储啊,但是现在我确实想查询呢,总不能将之前建的索引重新建一遍吧,如果数据量小的话还可以考虑一下,那么数据量较大呢,继续坚持重建?好吧那我们只能说,你有个性。

   2、FieldCache取为Store字段的内容

  当然啦,我没个性,选择其他方法,lucene中为我们提供了一个类FieldCache,有了这类我们就不需要担心没有Store,FieldCache是从到排序表中进行读取字段内容,而不是索引中。下面就简单介绍一下如何使用。

   

   
   
   
   
  1. public String[] getFieldCache(String indexPath,String field) { 
  2.         String []cacheValues = null
  3. FieldCache fieldCache;
  4.         Directory directory = this.getDirectory(indexPath); 
            IndexReader indexReader = this.getIndexReader(directory);  try { 
  5.             cacheValues[i] = fieldCache.DEFAULT.getStrings(indexReader,field); 
  6.             indexReader.close(); 
  7.             directory.close(); 
  8.         } catch (Exception e) { 
  9.             e.printStackTrace(); 
  10.         } 
  11.            return cacheValues; 
  12.     } 

   通过上面的代码,我们可以发现fieldCache.DEFAULT.getString()返回的是一个数组,其实数组的长度也就是文档数目,从下标0到最后分别代表文档的id,如果我们要获取5号文档的该字段内容,那就取数组中下标为5的内容。

  Solr:

  很多时候,我们要处理日志文件,例如现在有一个日志文件,这个文件记录着一段时间内访问我们网站的客户的ip,访问时间……

   现在我想统计一下,各个ip在这段时间内访问的次数,那怎么办呢,在solr中,为我们提供了facet,即对字段进行统计。当然在进行统计之前我们需要知道如何在solr中访问lucene建立的索引,既然solr是lucene的封装,那么solr访问lucene的索引也是肯定可以的。不多说,看方法:

   3.solr访问lucene索引

     a.最简单,将索引拷贝到data/index目录下,也就是solr默认的索引目录。

     b.在solrconfig.xml配置文件中加上

      ${solr.data.dir:E:/index/1}

     默认会在你solr目录下的data/index下面,在这边可以自定义目录,但是需要注意的是solr会在我们设定的目录后面默认加上index,即E:/index/1会默认变成E:/index/1/index,这是我们需要注意的。

     c.

class="com.focuschina.directory.MyFirstDirectory" />w我们可以实现我们自己的DirectoryFactory,在里面我们可以返回指定的目录。不多说了。

   最后,不要忘了在schema.xml中配置对应的索引字段。

  4.facet统计

    解决了solr访问lucene目录的问题,接下来的问题就是统计,不多说,上代码:

    

   
   
   
   
  1. public void facet(String field) { 
  2.          SolrQuery query = new SolrQuery("*:*"); 
  3.         SolrServer solrServer=new HttpSolrServer("http://localhost/core0/"); 
  4.         query.setFacet(true); 
  5.         query.addFacetField(field); 
  6.         try { 
  7.             QueryResponse response=solrServer.query(query); 
  8.             List facets= response.getFacetFields(); 
  9.             for(FacetField facet:facets){ 
  10.                 System.out.println("field:"+facet.getName()); 
  11.                 System.out.println("============================="); 
  12.                 List counts=facet.getValues(); 
  13.                 for(Count count:counts){ 
  14.                     System.out.println(count.getName()+" "+count.getCount()); 
  15.                 } 
  16.             } 
  17.         } catch (Exception e) { 
  18.             System.out.println(e.getMessage()); 
  19.         } 
  20.     } 

    这里我只提供简单的例子,欢迎大家给出宝贵意见。

    我也要好好休息一下了。祝大家开心。