`
fcm915
  • 浏览: 111104 次
  • 性别: Icon_minigender_1
  • 来自: 泰安
社区版块
存档分类
最新评论

Lucene小记

    博客分类:
  • java
阅读更多
Lucene.java:
建索引:
public class Lucene {  
    private Lucene() {}
    
    public static final String INDEX_DIR = "E:\\index";
    
    public static void index(ArrayList list, boolean create) {
    
        final File indexDir = new File(INDEX_DIR);
        Date start = new Date();
        try {
            IndexWriter writer = new IndexWriter(indexDir, new MMAnalyzer(), create);
            writer.setMergeFactor(100);
            for (int i=0; i<list.size(); i++){
                System.out.println("---i="+i);
                writer.addDocument(Doc.Document((BasicElement)list.get(i)));
            }
            writer.optimize();
            writer.close();
            
            Date end = new Date();
            System.out.println(end.getTime() - start.getTime() + " total milliseconds");
        } catch (IOException e) {
            System.out.println(e);
        }
    }

  
    public static ArrayList search(String strContent, String strDistrict,String StrBegin,String strEnd){
 
    	
        ArrayList list = new ArrayList();
        try {
            BooleanQuery query = new BooleanQuery();
            StringTokenizer st=null;
            if(strContent!=null&& !"".equals(strContent)){
	              st = parseString("content", strContent);
	              while (st.hasMoreTokens()) {
	                  String str = "*"+st.nextToken()+"*";
	                  Query queryContent = new WildcardQuery(new Term("content",str));
	                  query.add(queryContent,BooleanClause.Occur.MUST);
	              }
            }
            if(strDistrict!=null&& !"".equals(strDistrict)){
                st = parseString("district", strDistrict);
                while (st.hasMoreTokens()) {
                    String str = "*"+st.nextToken()+"*";
                    Query queryDistrict = new WildcardQuery(new Term("district",str));
                    query.add(queryDistrict,BooleanClause.Occur.MUST);
                }
            }
            if(StrBegin!=null&& !"".equals(StrBegin) && strEnd!=null&& !"".equals(strEnd)){
	              RangeQuery queryTime = new RangeQuery(new Term("time",StrBegin), new Term("time",strEnd), true);
	              query.add(queryTime,BooleanClause.Occur.MUST);
            }
            System.out.println("query=" + query);
            Searcher searcher = new IndexSearcher(INDEX_DIR);
            
            Hits hits = searcher.search(query);
            System.out.println("hits.length()=" + hits.length());
            
            for (int i = 0; i < hits.length(); i++) {
                Document doc = hits.doc(i);
                HashMap map = new HashMap();
                map.put("table",doc.get("table"));
                map.put("pid",doc.get("pid"));
                //map.put("district",doc.get("district"));
                //map.put("time",doc.get("time"));
                System.out.println("doc.get table="+doc.get("table"));
                list.add(map);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return list;
    }  
  
    public static StringTokenizer parseString(String strField, String strQuery){
        StringTokenizer st = null;
        try {
            MMAnalyzer analyzer = new MMAnalyzer();  
            QueryParser parser = new QueryParser(strField, analyzer);
            Query query = parser.parse(strQuery);
            st = new StringTokenizer(query.toString(strField).replace('\"', ' '));
        }catch (Exception e) {
            System.out.println(e);
        }
        return st;
    }  
    
    /*当添加一条新记录时触发该方法,同步增加索引记录*/
    public static void insertIndex(BasicElement entity) {
        try {
            IndexWriter writer = new IndexWriter(INDEX_DIR, new MMAnalyzer(), false);
            writer.addDocument(entity);
            writer.optimize();/*如果速度很慢,删除此行代码*/
            writer.close();
            System.out.println("insert Index OK!");
        } catch (IOException e) {
            System.out.println(e);
        }
    }    
    /*当删除一条记录时触发该方法,同步更新索引*/
    public static void deleteIndex(BasicElement entity) {
        try{
            Analyzer analyzer = new StandardAnalyzer();
            BooleanQuery query = new BooleanQuery();
    
            QueryParser parserPid = new QueryParser("pid", analyzer);
            Query queryPid = parserPid.parse(entity.getPid());
            query.add(queryPid,BooleanClause.Occur.MUST);
            
            QueryParser parserTable = new QueryParser("table", analyzer);
            Query queryTable = parserTable.parse(entity.getType());
            query.add(queryTable,BooleanClause.Occur.MUST);
            
            Searcher searcher = new IndexSearcher(INDEX_DIR);
            Hits hits = searcher.search(query);
            
            if (hit.length()>0){
                IndexReader reader = IndexReader.open(INDEX_DIR);
                reader.deleteDocument(hits.id(0));
                reader.close();
            }
        } catch (IOException e) {
            System.out.println(e);
        }
    }    
    /*当修改一条记录时触发该方法,同步更新索引*/
    public static void modifyIndex(BasicElement entity) {
        deleteIndex(entity);
        insertIndex(entity);
    }


    /*定时调用该方法,根据记录的修改时间,更新和增加索引记录
    ArrayList list是在上次更新索引到现在这段时间内所有修改过的记录*/    
    public static void updateIndex(ArrayList list) {
        try{
            for(int i=0; i<list.size(); i++){
                BasicElement entity = (BasicElement)list.get(i);
                deleteIndex(entity);
            }
            IndexWriter writer = new IndexWriter(INDEX_DIR, new MMAnalyzer(), false);
            writer.setMergeFactor(100);
            for (int i=0; i<list.size(); i++){
                writer.addDocument(Doc.Document((BasicElement)list.get(i)));
            }
            writer.optimize();
            writer.close();
        } catch (IOException e) {
            System.out.println(e);
        }
    }    
    
    public static void main(String[] args) {
    
    }  
    
} 



Doc.java
public class Doc {
  private Doc() {}
  
  public static Document Document(BasicElement entity){
	String strTable = "";
	String strPid = "";
	String strDistrict = "";
	String strTime = "";
	String strContent = "";
	if (strTable.equals("type")){
		strDistrict = "";
	}
    Document doc = new Document();
    
    doc.add(new Field("table",strTable, Field.Store.YES, Field.Index.TOKENIZED));
    doc.add(new Field("pid", strPid, Field.Store.YES, Field.Index.TOKENIZED));
    doc.add(new Field("district", strDistrict, Field.Store.NO, Field.Index.TOKENIZED));
    doc.add(new Field("time", strTime, Field.Store.NO, Field.Index.TOKENIZED));
    doc.add(new Field("content",strContent, Field.Store.NO, Field.Index.TOKENIZED));

	//System.out.println("Document.table:"+doc.get("table"));
	
    return doc;
  }


分享到:
评论

相关推荐

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0

    lucene-4.7.0全套jar包

    【Lucene 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...

    Lucene3.5源码jar包

    本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...

    Lucene时间区间搜索

    Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...

    lucene in action英文版 lucene 3.30包

    《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...

    Annotated Lucene 中文版 Lucene源码剖析

    《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...

    Lucene示例 BM25相似度计算

    在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...

    Lucene简介.介绍

    【Lucene 简介】 Lucene 是一个强大的开源全文搜索库,由 Java 编写,主要用于为应用程序添加全文检索功能。它不是一个完整的全文搜索引擎应用,而是一个工具包,允许开发者将其集成到自己的软件中,以实现高效、...

    计算机专业外文翻译(lucene相关)

    "计算机专业外文翻译(lucene相关)" 本文翻译了论文"Scale-up x Scale-out: A Case Study using Nutch/Lucene",介绍了计算机专业领域中关于Lucene相关的知识点。 Scale-up vs Scale-out 论文中讨论了两个相对...

    lucene 2.0 api以及lucene 3.0 api

    **Lucene 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...

    Lucene的原理完整版pdf

    **Lucene原理详解** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单但功能强大的API,用于索引和搜索文本数据,使得开发者可以轻松地在...

    lucene所有的jar包

    《全面解析Lucene jar包:从基础到应用》 在信息技术高速发展的今天,搜索引擎已经成为我们获取信息不可或缺的工具。在Java领域,Lucene作为一个强大的全文搜索引擎库,深受开发者喜爱。本文将详细介绍“lucene所有...

    lucene in action 2nd edition, lucene in action 第二版 PDF

    《Lucene in Action 第二版》是一本深入探讨Apache Lucene全文检索库的专业书籍,它在Java开发领域具有很高的权威性。这本书详细介绍了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者和信息检索爱好者的...

    lucene-core-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...

    Lucene与关系型数据库对比

    《Lucene与关系型数据库对比:深度解析与应用探索》 在信息爆炸的时代,数据管理和检索成为了企业乃至个人日常工作中不可或缺的部分。随着技术的发展,不同的数据处理方式应运而生,其中Lucene与关系型数据库作为两...

    Lucene资料大全(包括Lucene_in_Action书等)

    标题"Lucene资料大全(包括Lucene_in_Action书等)"表明这是一个包含全面Lucene学习资源的集合,其中最显著的是《Lucene_in_Action》这本书。这是一本广泛认可的关于Apache Lucene的权威指南,通常被简称为LIA,它深入...

    lucene.NET 中文分词

    **Lucene.NET 中文分词技术详解** Lucene.NET 是一个高性能、全文检索库,它是Apache Lucene项目在.NET平台上的实现。作为一个开源的搜索引擎框架,Lucene.NET为开发者提供了强大的文本搜索功能。而在处理中文文档...

    Lucene 5 主要jar包

    Apache Lucene是一个开源全文搜索引擎库,它为Java开发者提供了强大的文本搜索功能。在这个"Lucene 5 主要jar包"中,我们找到了一系列与Lucene 5.0.0相关的jar文件,这些文件是构建和运行基于Lucene的搜索应用程序的...

    经典的lucene实例代码及详细解析以及lucene结构流程介绍

    经典的Lucene实例代码及详细解析以及Lucene结构流程介绍 Lucene是一个功能强大且灵活的开源搜索引擎库,它提供了一个简单易用的API,允许开发者快速构建搜索应用程序。下面将对Lucene的实例代码和结构流程进行详细...

Global site tag (gtag.js) - Google Analytics