zoukankan      html  css  js  c++  java
  • Lucence.net索引技术 二

    一、 Lucene索引创建和优化 [版本2.9.0以上] 

    Lucene索引的创建首先需要取得几个必须的对象: 

    1、分词器//可以采用其他的中文分词器 
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);//分词器 

    2、lucene目录 
    File dir = new File(indexDir);// indexDir为文件路径 
    //这种目录存在锁机制,在打开目录时,写的权利一次只分给一个用户;有效保证了索引文件不会因为多线程问题,同时写索引导致文件损坏。 
    Directory idxDir = new SimpleFSDirectory(dir, new SimpleFSLockFactory()); 

    3、写索引对象 
    // isNewCreate为boolean值 
    IndexWriter writer = new IndexWriter(idxDir, analyzer, isNewCreate, IndexWriter.MaxFieldLength.LIMITED); 

    对writer对象可以做一些基本设置,以便优化数据操作。 
    writer.setMergeFactor(50); // 多少个合并一次【优化缓存】 
    writer.setMaxMergeDocs(5000); // 一个segment最多有多少个document【优化索引存储的segment文件】 

    4、document实例化和参数设置 
    writer可以写入的对象document也需要预先申明。 
    Document doc = new Document(); 
    这个document是lucene自定义的一种存储节点对象。一个document可以包含N个filed域,N的取值可以在indexWriter定义的时候申明。各种域对应不同的应用场景。 

    //只存储,不做索引分析,value值就是唯一索引对应该条记录 
    Field field = new Field(key1, value1, Store.YES, Index.NOT_ANALYZED_NO_NORMS); 
    //存储,且做索引分析,value值被分析器解析成各种分词,一组索引对应该条记录 
    field = new Field(key2, value2, Store.YES, Index.ANALYZED); 
    //只存储,没有索引对应该域 
    field = new Field(key3, value3, Store.YES, Index.NO); 

    // 数字范围搜索 
    NumericField numericField = new NumericField(key4, Store.YES, true); 
         numericField.setLongValue(value4); 

    域生成之后通过document的add方法添加到一个document对象中。 
    //document 域的添加 
    doc.add(field); 
    doc.add(numericField); 


    5、对索引的写操作和优化操作关键步骤如下 

    writer.addDocument(doc);//向索引文件中写数据 
    writer.optimize();// 索引优化,一般执行此步骤时,所消耗的内存是写入索引所需内存的2倍,在执行索引生成操作的时候本身就对内存有比较大的消耗,最好在索引创建完成之后,执行此步骤。 
    writer.commit();//数据提交 
    writer.rollback();//数据回滚 
    writer.close();//关闭流索引写入器,此步骤才真正将数据写入到索引文件中。 


    二、 Lucene索引实现 精确查询 分词查询 范围查询 多条件查询等 

    查询的步骤实现: 

    1、首先需要设置查询条件参数。 
    BooleanQuery query = new BooleanQuery();// 多条件查询 处理检索条件 

    Query termQuery = new TermQuery(new Term(key,value)); // 基本/精确 查询 
    query.add(termQuery, Occur.MUST);// 根据索引中的document生成时的设置,可以实现精确记录 

            /* 范围查询 */ 
    Query numericRangeQuery = NumericRangeQuery.newLongRange(key, minValueLong, maxValueLong, true, true); 
    query.add(numericRangeQuery, Occur.MUST); // numericRangeQuery是按数值范围匹配 

            /* 多域组合查询 */ 
    BooleanClause.Occur[] occurs = 
    new BooleanClause.Occur[] { BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD }; 
    Query multiFieldQuery = MultiFieldQueryParser.parse(keyWord, new String[] { key1, key2 }, occurs, analyzer); 
    query.add(multiFieldQuery, Occur.MUST);// multiFieldQuery是把关键字keyWord分别在key1和key2中匹配 组合查询 

    2、创建索引搜索器。 
    //以只读方式,创建索引搜索器 
    IndexSearcher searcher = new IndexSearcher(idxDir, readOnly);//readOnly 为boolean值 

    3、设置排序条件。 
    //设置根据哪个域的key来排序 
    SortField field = null; 
    // Long型降序 
    field = new SortField(key, SortField.LONG, true); 
    // Long型升序 
    field = new SortField(key, SortField.LONG, false); 
    // 搜索引擎权重 
    field = new SortField(null, SortField.SCORE, true);//不需要指定域的key来排序,lucene中会根据查询结果出现的次数给每个结果设置排序参数,搜索结果会按照这个排序参数的大小来由大到小进行排序。【即为搜索结果热门程度的降序排列】 

    // Integer型排序 
    field = new SortField(key, SortField.INT, true); 

    // 单条件排序 
    Sort sort =  = new Sort(field); 

    // 多条件排序 
    SortField[] fields = new SortField[] { field1, field2 }; 
    Sort sort =  = new Sort(fields); 

    4、执行查询操作,并处理获得查询结果 

    //查询获取结果 
    // 查询      searcher.maxDoc()为searcher中所包含的最大document下标值 filter为过滤器[没有的话,一般写null] 
    TopFieldDocs docs = searcher.search(query, filter, searcher.maxDoc(), sort); 
    ScoreDoc[] scoreDocs = docs.scoreDocs;//权值对象 包含document下标信息,能确定searcher中的document的下标。 
    int docCount = scoreDocs.length;//查询结果统计 
    // 取出最后一个查出的document对象 

    Document doc = searcher.doc(scoreDocs[docCount - 1].doc); // 通过document下标值,获取document对象 

    来源:http://lc0451.iteye.com/blog/616176 

    来源:http://www.cnblogs.com/lhj588/archive/2013/02/06/2900937.html 

  • 相关阅读:
    矩阵论基础 3.1初等变换
    最优化理论与方法 9 二次规划
    最优化理论与方法 10 罚函数法
    矩阵论基础 2.5 用Matlab实现矩阵的基本运算
    最优化理论与方法 目录
    UG OPEN API编程基础 12UIStyler对话框
    第十四章 达朗伯原理 1
    矩阵论基础 2.3 方阵的几种运算
    矩阵论基础 3.5 用Matlab求解线性方程组
    测试一下博客的html代码机制
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/4140512.html
Copyright © 2011-2022 走看看