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

lucene学习笔记 高级篇

阅读更多
一、环境
需要导入lucene.jar包(在lucene.apache.org下载)
二、基本概念
1Lucene的工作流程:
(1) 使用IndexWriter,在指定的目录建立索引的文件
  (2) 
将需要检索的数据转换位DocumentFiled对象,然后将DocumentIndexWriter添加倒索引的文件中
   (3) 
处理索引信息,关闭IndexWriter
   (4) 
创建搜索的Query
   (5) 
IndexSearcher
2Lucene的字段类型
Lucene有四种不同的字段类型:KeywordUnIndexedUnStoredText,用于指定建立最佳索引。
?        Keyword
字段是指不需要分析器解析但需要被编入索引并保存到索引中的部分。JavaSourceCodeIndexer类使用该字段来保存导入类的声明。
?        UnIndexed
字段是既不被分析也不被索引,但是要被逐字逐句的将其值保存到索引中。由于我们一般要存储文件的位置但又很少用文件名作为关键字来搜索,所以用该字段来索引Java文件名。
?        UnStored
字段和UnIndexed字段相反。该类型的Field要被分析并编入索引,但其值不会被保存到索引中。由于存储方法的全部源代码需要大量的空间。所以用UnStored字段来存储被索引的方法源代码。可以直接从Java源文件中取出方法的源代码,这样作可以控制我们的索引的大小。
?        Text
字段在索引过程中是要被分析、索引并保存的。类名是作为Text字段来保存。下表展示了JavaSourceCodeIndexer类使用Field字段的一般情况。
 
3基本概念(与传统表的对比):
Lucene
传统表
说明
IndexWriter
table
 
Document
一条记录
 
Field
每个字段
分为可被索引的,可切分的,不可被切分的,不可被索引的几种组合类型
Hits
RecoreSet
结果集
 
IndexWriter提供了一些参数可供设置,列表如下
 
属性
默认值
说明
mergeFactor
org.apache.lucene.mergeFactor
10
控制index的大小和频率,两个作用
1.一个段有多少document
2.多少个段合成一个大段
maxMergeDocs
org.apache.lucene.maxMergeDocs
Integer.MAX_VALUE
限制一个段中的document数目
minMergeDocs
org.apache.lucene.minMergeDocs
10
缓存在内存中的document数目,超过他以后会写入到磁盘
maxFieldLength
 
1000
一个Field中最大Term数目,超过部分忽略,不会indexfield中,所以自然也就搜索不到
这些参数的的详细说明比较复杂:mergeFactor有双重作用
(1)设置每mergeFactordocument写入一个段,比如每10document写入一个段
(2)设置每mergeFacotr个小段合并到一个大段,比如10document的时候合并为1小段,以后有10个小段以后合并到一个大段,有10个大段以后再合并,实际的document数目会是mergeFactor的指数
简单的来说mergeFactor 越大,系统会用更多的内存,更少磁盘处理,如果要打批量的作index,那么把mergeFactor设置大没错, mergeFactor 小了以后, index数目也会增多,searhing的效率会降低,但是mergeFactor增大一点一点,内存消耗会增大很多(指数关系),所以要留意不要”out of memory”
maxMergeDocs设置小,可以强制让达到一定数量的document写为一个段,这样可以抵消部分mergeFactor的作用.
minMergeDocs
相当于设置一个小的cache,第一个这个数目的document会留在内存里面,不写入磁盘。这些参数同样是没有最佳值的,必须根据实际情况一点点调整。
maxFieldLength
可以在任何时刻设置,设置后,接下来的indexField会按照新的length截取,之前已经index的部分不会改变。可以设置为Integer.MAX_VALUE
 
4几种查询方式      
查询方式
说明
TermQuery
条件查询
例如:TermQuery tquery=new TermQuery(new Term("name","jerry"));
name:字段名
jerry:要搜索的字符串
MultiTermQuery
多个字段进行同一关键字的查询
Query query= null;
Query =MultiFieldQueryParser.parse("",new String[] {"title","content"},analyzer);
Searcher searcher=new IndexSearcher(indexFilePath);
 Hits hits=searcher.search(query);
BooleanQuery
例如:BooleanQuery bquery=new BooleanQuery();
 bquery.add(query,true,false);
   bquery.add(mquery,true,false);
   bquery.add(tquery,true,false);
   Searcher searcher=new IndexSearcher(indexFilePath);
    Hits hits=searcher.search(bquery);
WildcardQuery
语义查询(通配符查询)
例:Query query= new WildcardQuery(new Term("sender","*davy*"));
PhraseQuery
短语查询
PrefixQuery
前缀查询
PhrasePrefixQuery
短语前缀查询
FuzzyQuery
模糊查询
RangeQuery
范围查询
SpanQuery
范围查询
在全文检索时建议大家先采用语义时的搜索,先搜索出有意义的内容,之后再进行模糊之类的搜索
(1)联合两个索引查询,已解决:
IndexSearcher[] searchers = new IndexSearcher[2]; 
  
searchers[0] = new IndexSearcher(m_indexpath);
searchers[1] = new IndexSearcher(m_outindexpath);

MultiSearcher multiSearcher = new MultiSearcher(searchers);

(2)
还有个进行多条件搜索 and or 的操作————
MultiFieldQueryParser
建议重新封装
MultiFieldQueryParser.Parser(p[],d[],f[],analyer)  
or and操作合一
或者
BooleanQuery m_BooleanQuery = new BooleanQuery();
Query query = QueryParser.Parse(m_SearchText, "INSTRUMENT_NAME", analyzer);
Query query2 = QueryParser.Parse(m_SearchText2, "INSTRUMENT_NAME2", analyzer);
m_BooleanQuery.Add(query, true, false);
m_BooleanQuery.Add(query2, true, false);
(3)复合查询(多种查询条件的综合查询)
Query query=MultiFieldQueryParser.parse("索引”,new String[] {"title","content"},analyzer);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++)  {
            System.out.println(hits.doc(i).get("name"));
}
 
5.为查询优化索引(index)
Indexwriter.optimize()方法可以为查询优化索引(index),之前提到的参数调优是为indexing过程本身优化,而这里是为查询优化,优化主要是减少index文件数,这样让查询的时候少打开文件,优化过程中,lucene会拷贝旧的index再合并,合并完成以后删除旧的index,所以在此期间,磁盘占用增加, IO符合也会增加,在优化完成瞬间,磁盘占用会是优化前的2,optimize过程中可以同时作search
 
 
 
4.org.apache.lucene.document.Field
        
即上文所说的“字段”,它是Document的片段section
        Field的构造函数:
       Field(String name, String string, boolean store, boolean index, boolean token)
        Indexed:如果字段是Indexed的,表示这个字段是可检索的。
        Stored:如果字段是Stored的,表示这个字段的值可以从检索结果中得到。
        Tokenized:如果一个字段是Tokenized的,表示它是有经过Analyzer转变后成为一个tokens序列,在这个转变过程tokenization中, Analyzer提取出需要进行索引的文本,而剔除一些冗余的词句(例如:athe,they等,详见 org.apache.lucene.analysis.StopAnalyzer.ENGLISH_STOP_WORDS org.apache.lucene.analysis.standard.StandardAnalyzer(String[] stopWords)API)。Token是索引时候的.
 
类型
Analyzed
Indexed
Stored
说明
Field.Keyword(String,String/Date)
N
Y
Y
这个Field用来储存会直接用来检索的比如(编号,姓名,日期等)
Field.UnIndexed(String,String)
N
N
Y
不会用来检索的信息,但是检索后需要显示的,比如,硬件序列号,文档的url地址
Field.UnStored(String,String)
Y
Y
N
大段文本内容,会用来检索,但是检索后不需要从index中取内容,可以根据urlload真实的内容
Field.Text(String,String)
Y
Y
Y
检索,获取都需要的内容,直接放index,不过这样会增大index
Field.Text(String,Reader)
Y
Y
N
如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略.
 
分享到:
评论

相关推荐

    Lucene 学习笔记 1

    本篇学习笔记将深入探讨 Lucene 的核心概念、工作流程以及如何通过 Indexer 和 Searcher 类进行索引与查询。 ### Lucene 的核心概念 1. **索引(Index)**: 在 Lucene 中,索引是文档内容经过分析、分词后的结构化...

    lucene学习笔记

    标题:Lucene学习笔记 描述:Lucene学习笔记,Lucene入门必备材料 知识点: 一、Lucene概述与文档管理策略 Lucene是一款高性能、全功能的文本搜索引擎库,广泛应用于文档检索、全文搜索等场景。为了提升搜索效率...

    【大搜集:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    lucene学习笔记 1 .txt lucene学习笔记 2.txt lucene学习笔记 3 .txt lucene入门实战.txt Lucene 的学习 .txt Lucene-2.0学习文档 .txt Lucene入门与使用 .txt lucene性能.txt 大富翁全文索引和查询的例子...

    lucene学习lucene学习

    Lucene 提供了高效、可扩展的索引和搜索功能,允许开发者轻松地在应用程序中集成高级文本检索功能。 在了解 Lucene 的工作原理之前,我们要明确一点:Lucene 不是一个完整的搜索引擎应用,而是用于构建搜索引擎的...

    lucene3.5学习笔记

    以上是对 Lucene 3.5 的学习笔记总结,涵盖了从索引构建到查询操作的基础和高级功能。通过深入理解这些概念和实践应用,可以帮助开发者更好地利用 Lucene 和 Solr 构建高效且功能强大的搜索应用。

    Lucene学习笔记(一)Lucene入门实例

    NULL 博文链接:https://kylinsoong.iteye.com/blog/719415

    Lucene学习笔记

    【Lucene学习笔记】 Lucene 是一款开源的全文检索框架,由Apache软件基金会维护,它提供了高效的、可扩展的搜索引擎功能。不同于一个完整的应用程序,Lucene 提供的是一个基础组件,开发者可以将其集成到自己的应用...

    lucene使用总结笔记

    lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记

    lucene 3.5学习笔记

    《Lucene 3.5 学习笔记》 在信息技术高速发展的今天,搜索引擎技术成为了信息检索的核心工具。Apache Lucene,作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene 3.5版本的相关知识...

    lucene3.0学习笔记(三)与paoding整合

    这篇学习笔记主要关注的是将Lucene 3.0与Paoding搜索引擎进行集成的实践与技术要点。 首先,Lucene是一个高性能、全文检索库,提供了完整的搜索功能,包括索引、查询、排序等。版本3.0是其发展过程中的一个重要里程...

    lucene基础学习笔记&源码

    **Lucene 基础学习笔记与源码分析** **一、Lucene 概述** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。它是一个 Java 开发的开源项目,被广泛应用于各种搜索引擎的构建,支持多种编程...

    本人的Lucene2.9学习笔记

    《深入理解Lucene 2.9.1:构建与搜索的全方位解析》 Lucene,作为一款开源的全文搜索引擎库,被广泛应用于各种信息检索场景。本文将详细讲解Lucene 2.9.1版本的核心概念、架构以及索引创建与搜索的流程。 一、...

Global site tag (gtag.js) - Google Analytics