`
高军威
  • 浏览: 182036 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene 4.0 学习

阅读更多
添加删除索引方法:
 /**
     * 优化索引,返回优化策略
     * 
     * @return
     */
    private static LogMergePolicy optimizeIndex()
    {
        LogMergePolicy mergePolicy = new LogByteSizeMergePolicy();

        // 设置segment添加文档(Document)时的合并频率
        // 值较小,建立索引的速度就较慢
        // 值较大,建立索引的速度就较快,>10适合批量建立索引
        // 达到50个文件时就和合并
        mergePolicy.setMergeFactor(50);

        // 设置segment最大合并文档(Document)数
        // 值较小有利于追加索引的速度
        // 值较大,适合批量建立索引和更快的搜索
        mergePolicy.setMaxMergeDocs(5000);

        // 启用复合式索引文件格式,合并多个segment
        mergePolicy.setUseCompoundFile(true);
        return mergePolicy;
    }

    private void Index()
    {
        Directory directory = null;
        File indexDir = new File(index_path);
        try
        {
            directory = FSDirectory.open(indexDir);
            IKAnalyzer analyzer = new IKAnalyzer();
            IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_40, analyzer);
            indexWriterConfig.setMergePolicy(optimizeIndex());
            indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
            IndexWriter writer = new IndexWriter(directory, indexWriterConfig);
            // 查询索引
            SWResultList indexList = new SWResultList(0, 1);
            SWInfoFactory.getInfo().listIndex(" order by idx_id", " and cz_status in ('0') ", indexList);
            int delCount = 0;
            int createCount = 0;
            for (Object idx : indexList.getMydata())
            {
                // 类型转换
                Map<?, ?> idxMap = (Map<?, ?>) idx;
                if (idxMap.get("cz_flag").toString().equals("1"))
                {
                    // 增加索引
                    Document document = InfoDocument.document("", idxMap.get("cz_id").toString());
                    if (document == null)
                    {
                        setStatus("9", idxMap.get("idx_id").toString());
                        logger.error("要创建索引的信息不存在,info_code=" + idxMap.get("cz_id").toString());
                    } else
                    {
                        try
                        {
                            setStatus("1", idxMap.get("idx_id").toString());
                            writer.addDocument(document);
                            setStatus("8", idxMap.get("idx_id").toString());
                            createCount++;
                        } catch (Exception e)
                        {
                            setStatus("9", idxMap.get("idx_id").toString());
                        }
                    }
                } else
                {
                    // 删除索引
                    Term term = new Term("Infocode", idxMap.get("cz_id").toString());
                    try
                    {
                        setStatus("1", idxMap.get("idx_id").toString());
                        writer.deleteDocuments(term);
                        setStatus("8", idxMap.get("idx_id").toString());
                        delCount++;
                    } catch (Exception e)
                    {
                        setStatus("9", idxMap.get("idx_id").toString());
                    }
                }
            }
            logger.info("新增索引 " + createCount + " 条!");
            logger.info("删除索引 " + delCount + " 条!");
            writer.close();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private void setStatus(String status, String idxid)
    {
        this.dao.update("update cec_idx set cz_status=" + status + " where idx_id='" + idxid + "'");
    }

    public boolean isRun()
    {
        return run;
    }

实现添加索引
/**
 * <ul>
 * <li>项目名称: ***</li>
 * <li>功能描述: 将信息封装到索引</li>
 *</ul>
 * @author Administrator
 * @version $Id: InfoDocument.java, 2013-7-22 下午4:52:01 Administrator Exp $
 */
public class InfoDocument
{
    public static Document document(String cz_table, String cz_id)
    {
        //查出要建索引的数据封装到map中
        Map info = SWInfoFactory.getInfo().getInfo(cz_table, cz_id);
        if (info == null)
        {
            return null;
        }
        Document doc = new Document();
        
        FieldType ft = new FieldType();
        ft.setStored(true); // 设置是否进行存储
        ft.setIndexed(true); // 设置是否能够索引到
        ft.setTokenized(true);// 设置是否进行分词分析
        
        FieldType ft2 = new FieldType();
        ft2.setStored(true); // 设置是否进行存储
        ft2.setIndexed(true); // 设置是否能够索引到
        ft2.setTokenized(false);// 设置是否进行分词分析

        Field ci_id = new Field("ci_id", info.get("ci_id") == null?"": info.get("ci_id").toString(), ft2);
        Field ci_title = new Field("ci_title", info.get("ci_title") == null?"": info.get("ci_title").toString(), ft);
        Field ci_title2 = new Field("ci_title2", info.get("ci_title2") == null?"":  info.get("ci_title2").toString(), ft);
        Field ci_ctime = new Field("ci_ctime", info.get("ci_ctime") == null?"":  info.get("ci_ctime").toString(), ft2);
        Field ci_keys = new Field("ci_keys", info.get("ci_keys") == null?"":  info.get("ci_keys").toString(), ft);
        
        Field ci_content = new Field("ci_content", info.get("ci_content") == null?"":  info.get("ci_content").toString(), ft);
        Field cf_title = new Field("cf_title", info.get("cf_title") == null?"":  info.get("cf_title").toString(), ft);
        Field s_cc_id = new Field("s_cc_id", info.get("s_cc_id") == null?"":  info.get("s_cc_id").toString(), ft2);
        Field s_cc_name = new Field("s_cc_name", info.get("s_cc_name") == null?"":  info.get("s_cc_name").toString(), ft);
        Field cc_supid = new Field("cc_supid", info.get("cc_supid") == null?"":  info.get("cc_supid").toString(), ft2);
        
        Field f_cc_id = new Field("f_cc_id", info.get("f_cc_id") == null?"":  info.get("f_cc_id").toString(), ft2);
        Field f_cc_name = new Field("f_cc_name", info.get("f_cc_name") == null?"":  info.get("f_cc_name").toString(), ft);
        
        doc.add(ci_id);
        doc.add(ci_title);
        doc.add(ci_title2);
        doc.add(ci_ctime);
        doc.add(ci_keys);
        
        doc.add(ci_content);
        doc.add(cf_title);
        doc.add(s_cc_id);
        doc.add(s_cc_name);
        doc.add(cc_supid);
        
        doc.add(f_cc_id);
        doc.add(f_cc_name);
        
        return doc;
    }
}

查询索引
public class SearchInfoutile
{
    private static String path = ConfigManager.getInstance().getConfigItem("cms.infoindex.path", "./eqinfoindex").toString();
    public static Map getInfoContent(String sareacode, int page)
    {
        Map map = new HashMap();
        map.put("resultlist", null);
        map.put("totalpage", 0);// 总页数
        map.put("totalpagenum", 0);// 总条数

        int searchRows = 7;// 每页显示的数据条数

        int totalpage = 0;
        int iStartRow = (page - 1) * searchRows;
        int iEndRow = page * searchRows;

        List list = new ArrayList();
        Directory directory = null;
        IndexSearcher isearcher = null;
        String[] searchFields = { "ci_title", "ci_title2", "ci_keys", "ci_content", "cf_title","s_cc_name","f_cc_name"};

        try
        {
            TopScoreDocCollector collector = TopScoreDocCollector.create(searchRows * page, false);
            Date start = new Date();
            File indexDir = new File(path);
            directory = FSDirectory.open(indexDir);
            IKAnalyzer analyzer = new IKAnalyzer();

            IndexReader indexReader = DirectoryReader.open(directory);
            isearcher = new IndexSearcher(indexReader);
            BooleanQuery booleanQuery = new BooleanQuery();

            // 检索的关键词
            if (sareacode != null && !"".equals(sareacode))
            {
                QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_40, searchFields, analyzer);
                Query q1 = parser.parse(sareacode);
                booleanQuery.add(q1, BooleanClause.Occur.MUST);
            }else {
                Date date = new Date();
                SimpleDateFormat time=new SimpleDateFormat("yyyyMMddHHmmss");
                String times = time.format(date);
                BytesRef lowerTerm = new BytesRef("19000101010100");
                BytesRef upperTerm = new BytesRef(times);
                TermRangeQuery query = new  TermRangeQuery("ci_ctime", lowerTerm, upperTerm, true, true);
                booleanQuery.add(query, BooleanClause.Occur.MUST);
            }

            isearcher.search(booleanQuery, collector);
            int numTotalHits = collector.getTotalHits();
            iStartRow = Math.min(numTotalHits, iStartRow);
            iEndRow = Math.min(numTotalHits, iEndRow);
            TopDocs topDocs = collector.topDocs(iStartRow, iEndRow - iStartRow);
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;

            list = toList(isearcher, scoreDocs);

            if (numTotalHits % searchRows == 0)
            {
                totalpage = numTotalHits / searchRows;
            } else
            {
                totalpage = numTotalHits / searchRows + 1;
            }

            map.put("resultlist", list);
            map.put("totalpage", totalpage);// 总页数
            map.put("totalpagenum", numTotalHits);// 总条数
            return map;
        } catch (IOException e)
        {
            e.printStackTrace();
        } catch (ParseException e)
        {
            e.printStackTrace();
        }
        return map;
    }

    // 索引集合转换成list集合
    public static List toList(IndexSearcher isearcher, ScoreDoc[] scoreDocs)
    {
        List list = new ArrayList();
        for (int i = 0; i < scoreDocs.length; i++)
        {
            Map map = new HashMap();
            try
            {
                Document targetDoc = isearcher.doc(scoreDocs[i].doc);
                
                map.put("ci_id", targetDoc.get("ci_id"));
                map.put("ci_title", targetDoc.get("ci_title"));
                map.put("ci_title2", targetDoc.get("ci_title2"));
                map.put("ci_ctime", targetDoc.get("ci_ctime"));
                map.put("ci_keys", targetDoc.get("ci_keys"));
                
                map.put("ci_content", targetDoc.get("ci_content"));
                map.put("s_cc_id", targetDoc.get("s_cc_id"));
                map.put("s_cc_name", targetDoc.get("s_cc_name"));
                map.put("s_cc_name", targetDoc.get("s_cc_name"));
                map.put("cc_supid", targetDoc.get("cc_supid"));
                
                map.put("f_cc_id", targetDoc.get("f_cc_id"));
                map.put("f_cc_name", targetDoc.get("f_cc_name"));
                
                list.add(map);
            } catch (CorruptIndexException e)
            {
                e.printStackTrace();
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }

        return list;
    }

    public static String torealtime(Date date, int a)
    {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, a);
        String starttime = (new SimpleDateFormat("yyyyMMdd")).format(cal.getTime()) + "000000";
        return starttime;
    }
}


lucene的一般查询方法

/**
	 * 查询方法
	 * @throws IOException 
	 * @throws CorruptIndexException 
	 * @throws ParseException 
	 * @throws InvalidTokenOffsetsException 
	 */
	public List Search(String searchString,LuceneResultCollector luceneResultCollector) throws CorruptIndexException, IOException, ParseException, InvalidTokenOffsetsException{
		//方法一:
	    //String[] fields = {"fileName","fieldid","date"};
        //MultiFieldQueryParser  用来查询多个字段 queryparser 
        //QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_40 ,fields, this.indexSettings.getAnalyzer());
		//Query query = parser.parse(searchString);
	    
		//词条查询 方法二:
        //Term t = new Term("fileName", searchString);
        //Query query = new TermQuery(t);
	    //String[] searchFields = {"Infotitle","Linkaddr","Skuname","Skudetaile"};
        //布尔类型查询(BooleanQuery)
	    //BooleanQuery query = new BooleanQuery();
	    BooleanQuery query = new BooleanQuery();
	    //检索的关键词
	    /*QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_40 ,searchFields,this.indexSettings.getAnalyzer());
        Query q1 = parser.parse("苹果");
        query.add(q1,BooleanClause.Occur.MUST);*/
       //哪个模块下下的
        Term t2 = new Term("fileName","java宝典");
        Query q2 = new TermQuery(t2);
        query.add(q2,BooleanClause.Occur.SHOULD);
        Term t2s = new Term("fileName","java神器");
        Query q2s = new TermQuery(t2s);
        query.add(q2s,BooleanClause.Occur.SHOULD);
       //供求类型
        /*Term t3 = new Term("Infotype","2");
        Query q3 = new TermQuery(t3);
        query.add(q3,BooleanClause.Occur.MUST);*/
       /* 
      //地区编号
        Term t4 = new Term("Areacode","");
        PrefixQuery q4 = new PrefixQuery(t4);
       query.add(q4,BooleanClause.Occur.MUST);
        
      //产品种类 
        Term t5 = new Term("Infocateg","");
        PrefixQuery q5 = new PrefixQuery(t5);
        query.add(q5,BooleanClause.Occur.MUST);*/
	   /* Term t1 = new Term("fileName", "*");
        TermQuery q1 = new TermQuery(t1);
	    
	    Term t2 = new Term("date", "");
	    PrefixQuery q2 = new PrefixQuery(t2);*/
	    
	   // Term t3 = new Term("fileName", "java");
        //PrefixQuery q3 = new PrefixQuery(t3);
        
		
		//query.add(q1,BooleanClause.Occur.MUST);
        //query.add(q3,BooleanClause.Occur.MUST);
        //query.add(q2,BooleanClause.Occur.MUST);
		
        //范围搜索(TermRangeQuery) ------------------------
        //当查询范围较大且满足条件的文档数量也很大时效率是很低的
	    //Date date = new Date();
        //SimpleDateFormat time=new SimpleDateFormat("yyyyMMddHHmmss");
        //String times = time.format(date);
        //范围搜索(TermRangeQuery)
        //当查询范围较大且满足条件的文档数量也很大时效率是很低的
        //BytesRef lowerTerm = new BytesRef("19000101010100");
        //BytesRef upperTerm = new BytesRef(times);
        //System.out.println("19000101010100");
        //System.out.println(times);
        //TermRangeQuery query = new  TermRangeQuery("Pubtime", lowerTerm, upperTerm, true, true);
        //模糊查询
        //另外两个构造函数 
        //FuzzyQuery fd  = new FuzzyQuery(term, maxEdits)
        //maxEdits 最大相似度,默认为0.5(待议 3.0版的)
        //prefixLength 表示进行模糊匹配的时候,要有多少个前缀字母必须完全匹配
        //如果是1,表示所有词条只有第一个字母与检索关键字相符时,才会被放入备选集合中
        //FuzzyQuery fd  = new FuzzyQuery(t,int 1,int prefixLength)
        //FuzzyQuery fuzzyQuery = new FuzzyQuery(new Term("fileName", "java"), 0); // 数字越小越精确0-2
		
        //前缀查询  最前面的几个字
        //PrefixQuery query2 = new PrefixQuery(term);
        
        //短语查询 先拆分成单字 核心方法 使用 布尔类型查询(BooleanQuery)来装载子句
        //子句间关系设为 MUST取其交集
        //setSlop(int) 设置坡度,默认值为0,给出严格匹配短语的文档作为结果,
        //设置为setSlop(1),表示中间可以插入无关字数的个数 1代表中间可以插入无关字个数为1个
        //PhraseQuery query2 = new PhraseQuery();
        //query2.add(term);
        //query2.setSlop(1);
        
        //多短语查询(自我感觉鸡肋,也许有一天我会用到他的)
        //MultiPhraseQuery query2 = new MultiPhraseQuery();
        
        //通配符搜索
        //Term term = new Term("filed","?o*");
        //WildcardQuery query2 = new WildcardQuery(term); 
        
        //跨度搜索
        //SpanTermQuery query2 = new SpanTermQuery(term);
        
        //Sort sort = new Sort();
        //SortField sortField = new SortField("fileid",FieldCache.DEFAULT_INT_PARSER, false); 
        //sort.setSort(sortField);
        //ScoreDoc[] docs = this.indexSearcher.search(query,100,sort).scoreDocs;
        
        ScoreDoc[] docs = this.indexSearcher.search(query,100).scoreDocs;
		System.out.println("一共有:"+docs.length+"条记录");
		List result = luceneResultCollector.collect(docs, this.indexSearcher, query ,this.indexSearcher,this.indexSettings.getAnalyzer());
		return result;
	}
分享到:
评论

相关推荐

    lucene4.0实例

    《Lucene4.0实例详解》 Lucene是一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统中。这里我们主要探讨的是Lucene 4.0版本的实例应用,旨在通过实际操作来理解其核心概念和功能。 一、Lucene基础 Lucene ...

    lucene4.0 demo

    《Lucene 4.0:构建搜索引擎的基本操作详解》 Lucene 4.0是一款强大的全文搜索引擎库,...继续深入学习,可以掌握更复杂的查询构造、近实时搜索、多字段排序等高级特性,从而在实际项目中充分利用Lucene的强大功能。

    lucene4.0简单的新增和查询

    通过学习这个项目,开发者可以快速了解 Lucene 4.0 的基本操作,并将其应用到自己的搜索应用中。 总之,Lucene 4.0 提供了强大的文本索引和搜索功能,让开发者能够轻松地在应用程序中集成高级搜索功能。这个简单的...

    IK Analyzer 2012FF_hf1_IK分词lucene4.0_源码

    "IK Analyzer 2012FF_hf1_IK分词lucene4.0_源码" 提供的是IK分词器的一个特定版本,适用于Lucene 4.0,这在当时是一个相对老但仍然被一些项目依赖的版本。 分词是中文信息处理的关键步骤,它将连续的汉字序列分割成...

    lucense demo

    本文将深入探讨如何利用Lucene 4.0版本和IK中文分词器搭建一个基础的全文搜索示例,并进行简单学习。 首先,让我们了解Lucene 4.0。这是一个开源的全文检索库,由Apache软件基金会开发。它提供了索引和搜索的底层...

    Lucene 索引图形化界面工具 LukeAll 3.5~4.0

    **Lucene 索引图形化界面工具 LukeAll 3.5~4.0** Lucene 是一个开源的全文搜索引擎库,它提供了强大的文本搜索功能,但其本身的接口设计是命令行或者编程式的,对于非开发人员或者在调试索引时可能会显得不太友好。...

    lucene-4.10.3源码

    这一版本的Lucene包含了多项改进和优化,是开发者研究和学习的重要参考。 一、Lucene的基本架构 Lucene的核心组件包括索引(Index)、查询解析器(Query Parser)、搜索(Search)和文档处理(Document)。源码中,...

    luceneDemo(完整代码)

    在"luceneDemo4.0"中,你将会看到以上概念的具体应用,包括创建索引、执行查询、高亮展示结果以及调整排序逻辑的示例代码。通过实践这个项目,你不仅可以了解Lucene的基本操作,还能学习到如何在实际项目中优化搜索...

    盘古分词、lucene3.0.3搜索的使用示例v1.2

    《盘古分词与Lucene 3.0.3在.NET 4.0中的应用实践》 盘古分词和Lucene是两个在中文信息处理领域广泛应用的工具,本示例将详细介绍如何在.NET 4.0环境中整合这两个组件,以实现高效的全文搜索功能,并新增了分页功能...

    java搜索引擎技术

    Lucene4.0-lisj可能是Lucene的4.0版本的一个学习资源或者示例代码集合。 在Java搜索引擎技术中,有几个关键知识点: 1. **文本分析(Text Analysis)**:这是搜索引擎处理输入文档的第一步,包括分词...

    Lucene笔记

    - **学习版本**:Lucene 4.0(由于lukeall-4.0.0-ALPHA.jar并非最新版本,因此选择该版本进行学习) ### 全文检索简介 全文检索是指根据检索条件,在所有文档中进行精确或模糊匹配的过程。这种检索方式特别适用于...

    程序员简历模板66.docx

    6. **LUCENE4.0搜索引擎**: 在项目中,他用LUCENE4.0实现商品搜索功能,LUCENE是一个全文检索库,用于快速建立高效的全文检索功能,这表明他对搜索引擎技术和开源工具的熟练应用。 7. **教育背景**: 拥有计算机科学...

    asp4.0 网上书店源码

    ASP.NET 4.0网上书店源码是一款基于微软.NET Framework ...通过研究这个ASP.NET 4.0网上书店源码,开发者不仅可以学习到Web开发的基本技能,还能深入了解电子商务应用的实现细节,提高自己的项目管理和代码组织能力。

    IKAnalyzer2012FF.jar

    IKAnalyzer2012FF.jar是一款专为中文处理而设计的分词工具,它在Lucene 4.0和Solr 4.0的基础上进行了优化和扩展,为中文信息检索提供强大的支持。这个jar包的核心功能是中文分词,它能够有效地将连续的汉字序列分割...

    Solr 4.0 源代码实例

    Solr 4.0 是Apache Lucene项目的一个子项目,是一个高性能、全文本搜索服务器,为企业级数据提供强大的搜索功能。源代码实例是学习Solr内部工作原理和自定义功能的关键资源,尤其对于开发者而言,深入理解源码有助于...

    hibernate 4.0

    - 文件名`hibernate-search-4.4.0.Final`表明包含的是Hibernate Search模块,这是一个集成全文搜索引擎(如Lucene)的插件,允许开发者实现复杂的全文搜索功能,例如模糊匹配、关键词高亮等。 6. **兼容性与互操作...

    开发人员_66_it人员简历_程序员简历模板_计算机相关专业.docx

    - 五百丁商城的后台系统开发项目中,候选人负责了项目框架的搭建、商品搜索功能(使用LUCENE4.0实现)以及团队协调,这展示了他在项目管理和搜索引擎技术上的专长。他还从中学习到了团队管理与任务分配的重要性。 ...

    Java开发工程师简历模板(四十四)

    - 在小七仔商城后台系统开发项目中,工程师担任了关键角色,包括设定项目功能目标、构建项目框架,并利用LUCENE 4.0实现了商品搜索功能。此外,他还负责团队任务分配和成果验收,这反映出良好的项目管理和团队协作...

    新手如何学习编程.doc

    - **高级主题**:深入学习搜索引擎Lucene、工作流JBPM、WebService、单点登录等高级主题。 - **新兴技术**:学习Hadoop等大数据处理技术,为将来从事云计算相关工作打下基础。 #### 3. 实践与项目经验 无论选择哪...

Global site tag (gtag.js) - Google Analytics