终于认真一次了,写一下最近学习solr和lucene遇到的一些小知识点:
首先说一下lucene,solr的奠基石,都说solr是对lucene的封装,在这我们也就这么想吧,但是并不是简单的封装,说深了,我也不理解,也是个小菜鸟一个。我现在用lucene主要是为大数据建立起索引,然后查询。
当然,在建立索引的过程中也有好多需要我们这些小菜鸟关注的,也许一开始的时候大家都不是很关心这些细节。
1、field是否存储。
- Document doc = new Document();
- doc.add(new Field(fieldname,map.fieldvalue,Store.NO,Index.NOT_ANALYZED));
我敢打赌,初学的朋友都会选择Store.Yes,但是很多情况,很多需求是不允许我们这么做的,例如现在有一个很大很大的大数据,直观的例子,几十G的大文件甚至更大,我们现在要对每行数据进行处理,分割,建立索引,如果这边我们采用Store.YESde 话,那么可以想象,代价是多么昂贵,那么你的索引完全可能是你源数据的好几倍,这样就违背了我们建索引的初衷,所以这里要合理选择。
假如大家的习惯都比较好,处理的很合理,那么又有一个问题来了,如果我们要对这些Field进行查询怎么办,或许有人会说了,那就用IndexSearch查询呗(不考虑老鸟的存在),不就是:
- IndexSearch inSearcher = new IndexSearcher(FSDirectory.getDirectory(new File(
- indexPath)));
- TopDocs tDocs = inSearcher.search(query, 1);
- scoreDocs = tDocs.scoreDocs;
- for (ScoreDoc sDoc : scoreDocs) {
- System.out.println(inSearcher.doc(sDoc.doc).get(fieldname));
- }
- int total = tDocs.totalHits;
- inSearcher.close();
但是,确实是这样吗,查询结果又是什么呢,想必是空吧,也就是null,因为你没有存储啊,但是现在我确实想查询呢,总不能将之前建的索引重新建一遍吧,如果数据量小的话还可以考虑一下,那么数据量较大呢,继续坚持重建?好吧那我们只能说,你有个性。
2、FieldCache取为Store字段的内容
当然啦,我没个性,选择其他方法,lucene中为我们提供了一个类FieldCache,有了这类我们就不需要担心没有Store,FieldCache是从到排序表中进行读取字段内容,而不是索引中。下面就简单介绍一下如何使用。
- public String[] getFieldCache(String indexPath,String field) {
- String []cacheValues = null;
- FieldCache fieldCache;
- Directory directory = this.getDirectory(indexPath);
IndexReader indexReader = this.getIndexReader(directory); try {- cacheValues[i] = fieldCache.DEFAULT.getStrings(indexReader,field);
- indexReader.close();
- directory.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return cacheValues;
- }
通过上面的代码,我们可以发现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配置文件中加上
<dataDir>${solr.data.dir:E:/index/1}</dataDir>
默认会在你solr目录下的data/index下面,在这边可以自定义目录,但是需要注意的是solr会在我们设定的目录后面默认加上index,即E:/index/1会默认变成E:/index/1/index,这是我们需要注意的。
c.<directoryFactory name="DirectoryFactory"
class="com.focuschina.directory.MyFirstDirectory" />w我们可以实现我们自己的DirectoryFactory,在里面我们可以返回指定的目录。不多说了。
最后,不要忘了在schema.xml中配置对应的索引字段。
4.facet统计
解决了solr访问lucene目录的问题,接下来的问题就是统计,不多说,上代码:
- public void facet(String field) {
- SolrQuery query = new SolrQuery("*:*");
- SolrServer solrServer=new HttpSolrServer("http://localhost/core0/");
- query.setFacet(true);
- query.addFacetField(field);
- try {
- QueryResponse response=solrServer.query(query);
- List<FacetField> facets= response.getFacetFields();
- for(FacetField facet:facets){
- System.out.println("field:"+facet.getName());
- System.out.println("=============================");
- List<Count> counts=facet.getValues();
- for(Count count:counts){
- System.out.println(count.getName()+" "+count.getCount());
- }
- }
- } catch (Exception e) {
- System.out.println(e.getMessage());
- }
- }
这里我只提供简单的例子,欢迎大家给出宝贵意见。
我也要好好休息一下了。祝大家开心。