`

Lucene 全文检索 之 详解

阅读更多

本人觉得学习,lucene 要明白数据库查询的原理就Ok了

 

1 源文件,要搜索的文件!类似数据库!

2 创建index 索引 ,也是非常类似数据库索引的

3 document 文件对象

4 search 搜索 累世 findDateSet

 

上面明白!

本文档参考   QQ:962589149    本人已经提供rar 实例给大家下载!欢迎交流!

1 概述

Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能,本总结使用lucene-- version lucene-3.6.0 version

2. lucene 的包结构

1org.apache.lucene.analysis对需要建立索引的文本进行分词、过滤等操作, 语言分析器,主要用于的切词Analyzer是一个抽象类,管理对文本内容的切分词规则。

2org.apache.lucene.analysis.standard是标准分析器

3org.apache.lucene.document提供对DocumentField的各种操作的支持。索引存储时的文档结构管理,类似于关系型数据库的表结构。

Document相对于关系型数据库的记录对象,Field主要负责字段的管理。

4org.apache.lucene.index是最重要的包,用于向Lucene提供建立索引时各种操作的支持。索引管理,包括索引建立、删除等。索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。

5org.apache.lucene.queryParser提供检索时的分析支持。查询分析器,实现查询关键词间的运算,如与、或、非等。

6org.apache.lucene.search 负责检索。检索管理,根据查询条件,检索得到结果。

7org.apache.lucene.store提供对索引存储的支持。数据存储管理,主要包括一些底层的I/0操作。

8org.apache.lucene.util提供一些常用工具类和常量类的支持

3.    索引文件格式

1 .fnm格式  包含了Document中所有field名称

2 .fdt.fdx格式  .fdt文件用于存储具有Store.YES属性的Field的数据;.fdx是一个索引,用于存储Document.fdt中的位置。

3 .tis .tii格式  .tis文件用于存储分词后的词条(Term),而.tii就是它的索引文件,它表明了每个.tis文件中的词条的位置。

4 deletable格式 文档被删除后,会首先在deletable文件中留下一个记录,要真正删除时,才将索引除去。

5 复合索引格式 .cfs

使用IndexWriteruseCompoundFile()  默认为True

4    lucene中主要的类

1 IndexWriter

1 public IndexWriter(String path,Analyzer a,Boolean create)

2 public IndexWriter(File path,Analyzer a,Boolean create)

3 public IndexWriter(Directory d,Analyzer a,Boolean create)

   第一个参数:索引存放在什么地方

第二个参数:分析器,继承自org.apache.lucene.analysis.Analyzer

第三个参数:为true时,IndexWriter不管目录内是否已经有索引了,一律清空,重新建立;当为false时,则IndexWriter会在原有基础上增量添加索引。所以在更新的过程中,需要设置该值为false

2 Document文档类

  方法                        描述

void add(Field field)                Document对象中添加字段

void removeField(String name)      删除字段。若多个字段以同一个字段名存在,则删除首先添加的字段;若不存在,则Document保持不变

void removeFields(String name)     删除所有字段。若字段不存在,则Document保持不变

Field getFieldString name       若多个字段以同一个字段名存在,则返回首先添加的字段;若字段不存在,则Document保持不变

Enumeration fields()              返回Document对象的所有字段,以枚举类型返回

Field [] getFields(String name)                根据名称得到一个Field的数组

String [] getValues(String name)               根据名称得到一个Field的值的数组

3 Field字段类

1 public Field(String name,String value,Store store,Index index);//直接的字符串方式

2 public Field(String name,String value,Store store,Index index,TermVector termVector);

3 public Field(String name,String value,Reader reader);//使用Reader从外部传入

4 public Field(String name,String value,Reader reader,TermVector termVector);

5 public Field(String name,byte[] value,Store store)//使用直接的二进制byte

4 Store

静态属性        描述

Store.NO        表示该Field不需要存储

Store.YES       表示该Field需要存储

Store.COMPRESS  表示用压缩方式来保存这个Field的值

     5 Index

Index.NO  不需要索引

Index.TOKENIZED  先被分词再被索引

Index.UN_TOKENIZED 不对该Field进行分词,但会对它进行索引

Index.NO_NORMS 对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。

     6 Directory

1  FSDirectory.getDirectory(path, true)第二个参数表示删除掉目录内原有内容

IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);//删除原有索引

FSDirectory fsDir=FSDirectory.getDirectory(path,true);

IndexWriter writer = new IndexWriter(fsDir, new StandardAnalyzer(), true);

2 RAMDirectory在内存中存放,读取速度快,但程序一运行结束,它的内容就不存在了

RAMDirectory ramDir=new RAMDirectory();

IndexWriter writer = new IndexWriter(ramDir, new StandardAnalyzer(), true);

IndexWriter writer = new IndexWriter(new RAMDirectory(), new StandardAnalyzer(), true);

7 IndexModifier 集成了IndexWriter的大部分功能和IndexReader中对索引删除的功能

8 IndexSearcher

基本案例(查询)

IndexSearcher searcher = new IndexSearcher(path);

Hits hits = null;

Query query = null;

QueryParser parser =new QueryParser("contents", new StandardAnalyzer());

query =parser.parse("11");

hits = searcher.search(query);

System.out.println("查找 word1 " + hits.length() + "个结果");

for(int i=0;i<hits.length()&&i<10;i++)

{

    Document d=hits.doc(i);

    System.out.println(d+" "+i+" "+hits.score(i)+" "+d.get("contents"));

}

searcher.close();

10   各种Query

 

1.1. 概述

query.toString()查看原子查询

 

1.2. 使用特定的分析器搜索

IndexSearcher searcher = new IndexSearcher(path );

Hits hits = null;

Query query = null;

QueryParser parser =new QueryParser("contents", new StandardAnalyzer());

query =parser.parse("11 a and hello");

hits=searcher.search(query); //查找 name:11 name:hello 1个结果

System.out.println("查找 "+query.toString()+" " + hits.length() + "个结果");

 

1.3. 按词条搜索—TermQuery

Query query = null;

query=new TermQuery(new Term("name","word1 a and"));

hits=searcher.search(query);// 查找 name:word1 a and 0个结果

System.out.println("查找 "+query.toString()+" " + hits.length() + "个结果");

 

1.4. 按“与或”搜索—BooleanQuery

1.和: MUSTMUST_NOT

2.或: SHOULDSHOULD

3.AB的并集-B  MUSTMUST_NOT

Query query1=null;

Query query2=null;

BooleanQuery query=null;

query1=new TermQuery(new Term("name","word1"));

query2=new TermQuery(new Term("name","word2"));

query=new BooleanQuery();

query.add(query1,BooleanClause.Occur.MUST);

query.add(query2,BooleanClause.Occur.MUST_NOT);

 

1.5. 在某一范围内搜索—RangeQuery

Term beginTime=new Term("time","200001");

Term endTime=new Term("time","200005");

RangeQuery query=null;

query=new RangeQuery(beginTime,endTime,false);//不包含边界值

 

1.6. 使用前缀搜索—PrefixQuery

Term pre1=new Term("name","wor");

PrefixQuery query=null;

query = new PrefixQuery(pre1);

 

1.7. 短语搜索—PhraseQuery

a)默认坡度为0

PhraseQuery query = new PhraseQuery();

query.add(new Term(bookname,”钢”));

query.add(new Term(bookname,”铁”));

Hits hits=searcher.search(query); //搜索“钢铁”短语,而非“钢”和“铁”

b)设置坡度,默认为0

PhraseQuery query = new PhraseQuery();

query.add(new Term(bookname,”钢”));

query.add(new Term(bookname,”铁”));

query.setSlop(1);

Hits hits=searcher.search(query);//搜索“钢铁”或“钢*铁”中含一字

 

1.8. 多短语搜索—MultiPhraseQuery

a)

MultiPhraseQuery query=new MultiPhraseQuery();

//首先向其中加入要查找的短语的前缀

query.add(new Term(bookname,”钢”));

//构建3Term,作为短语的后缀

Term t1=new Term(bookname,”铁”);

Term t2=new Term(bookname,”和”);

Term t3=new Term(bookname,”要”);

//再向query中加入所有的后缀,与前缀一起,它们将组成3个短语

query.add(new Term[]{t1,t2,t3});

Hits hits=searcher.search(query);

for(int i=0;i<hits.length();i++)

    System.out.println(hits.doc(i));

 

b)

MultiPhraseQuery query=new MultiPhraseQuery();

Term t1=new Term(bookname,”钢”);

Term t2 = new Term(bookname,”和”);

query.add(new Term[]{t1,t2});

query.add(new Term(bookname,”铁”));

 

c)

MultiPhraseQuery query=new MultiPhraseQuery();

Term t1=new Term(bookname,”钢”);

Term t2 = new Term(bookname,”和”);

query.add(new Term[]{t1,t2});

query.add(new Term(bookname,”铁”));

Term t3=new Term(bookname,”是”);

Term t4=new Term(bookname,”战”);

query.add(new Term[]{t3,t4});

 

1.9. 模糊搜索—FuzzyQuery

使用的算法为levenshtein算法,在比较两个字符串时,将动作分为3种:

l         加一个字母

l         删一个字母

l         改变一个字母

FuzzyQuery query=new FuzzyQuery(new Term(“content”,”work”));

public FuzzyQuery(Term term)

public FuzzyQuery(Term term,float minimumSimilarity)throws IllegalArgumentException

public FuzzyQuery(Term term,float minimumSimilarity,int prefixLength)throws IllegalArgumentException

其中minimumSimilarity为最小相似度,越小则文档的数量越多。默认为0.5.其值必须<1.0

FuzzyQuery query=new FuzzyQuery(new Term(“content”,”work”),0.1f);

其中prefixLength表示要有多少个前缀字母必须完全匹配

FuzzyQuery query=new FuzzyQuery(new Term(“content”,”work”),0.1f,1);

 

1.10.  通配符搜索—WildcardQuery

* 表示0到多个字符

? 表示一个单一的字符

WildcardQuery query=new WildcardQuery(new Term(“content”,”?qq*”));

 

1.11.            跨度搜索

1.11.1.      SpanTermQuery

效果和TermQuery相同

SpanTermQuery query=new SpanTermQuery(new Term(“content”,”abc”));

 

1.11.2.      SpanFirstQuery

Field内容的起始位置开始,在一个固定的宽度内查找所指定的词条

SpanFirstQuery query=new SpanFirstQuery(new Term(content,abc),3);//是第3word,不是byte

 

1.11.3.      SpanNearQuery

SpanNearQuery相当与PhaseQuery

SpanTermQuery people=new SpanTermQuery(new Term(“content”,”mary”));

SpanTermQuery how=new SpanTermQuery(new Term(“content”,”poor”));

SpanNearQuery query=new SpanNearQuery(new SpanQuery[]{people,how},3,false);

 

1.11.4.      SpanOrQuery

把所有SpanQuery的结果合起来

SpanTermQuery s1=new SpanTermQuery(new Term(“content”,”aa”);

SpanTermQuery s2=new SpanTermQuery(new Term(“content”,”cc”);

SpanTermQuery s3=new SpanTermQuery(new Term(“content”,”gg”);

SpanTermQuery s4=new SpanTermQuery(new Term(“content”,”kk”);

SpanNearQuery query1=new SpanNearQuery(new SpanQuery[]{s1,s2},1,false);

SpanNearQuery query2=new SpanNearQuery(new SpanQuery[]{s3,s4},3,false);

SpanOrQuery query=new SpanOrQuery(new SpanQuery[]{query1,query2});

 

1.11.5.      SpanNotQuery

从第1SpanQuery的查询结果中,去掉第2SpanQuery的查询结果

SpanTermQuery s1=new SpanTermQuery(new Term(“content”,”aa”);

SpanFirstQuery query1=new SpanFirstQuery(s1,3);

SpanTermQuery s3=new SpanTermQuery(new Term(“content”,”gg”);

SpanTermQuery s4=new SpanTermQuery(new Term(“content”,”kk”);

SpanNearQuery query2=new SpanNearQuery(new SpanQuery[]{s3,s4},4,false);

SpanNotQuery query=new SpanNotQuery(query1,query2);

 

1.12.            RegexQuery—正则表达式的查询

String regex="http://[a-z]{1,3}//.abc//.com/.*";

RegexQuery query=new RegexQuery(new Term("url",regex));

 

 

 

 

 

分享到:
评论

相关推荐

    lucene 全文检索

    **Lucene 全文检索详解** Lucene 是一个开源的全文检索库,由Apache软件基金会维护,它提供了高效的全文检索和分析功能。Lucene 广泛应用于网站搜索、文档检索、信息提取等领域,是Java开发人员实现全文搜索引擎的...

    全文检索(Lucene)详解

    **全文检索(Lucene)详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它提供了一个简单但功能强大的API,用于在各种数据源中进行高效的全文检索。Lucene不仅用于网站搜索引擎,还广泛...

    lucene全文检索简单索引和搜索实例

    《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...

    Lucene 实时搜索视频详解

    在"Lucene 实时搜索视频详解"的课程中,我们将深入探讨如何利用 Lucene 实现高效且实时的搜索功能。 一、Lucene 基础 1. **索引过程**:Lucene 的核心概念之一是建立索引,将原始文本数据转化为可快速查询的结构。...

    lucene全文检索资源包

    **Lucene 全文检索资源包详解** Lucene 是一个由 Apache 软件基金会开发的开源全文检索库,主要用于构建高效、可扩展的信息检索应用。这个“lucene全文检索资源包”包含了 Lucene 的一个早期版本——1.4.3,虽然...

    Lucene4 全文检索

    **Lucene4 全文检索详解** Lucene4 是 Apache 软件基金会的一个开源全文检索库,它为开发者提供了强大的文本搜索功能。作为一个高级的搜索引擎工具包,Lucene4 提供了完整的索引和搜索机制,使得在文件和数据库中...

    lucene实现全文搜索

    Lucene是一个由Java编写的高性能、可扩展的全文搜索引擎库。它提供了一种机制,使得开发者能够轻松地为自己的应用程序添加索引和搜索功能。作为Apache软件基金会的项目,Lucene具有开源和免费的特性,受到Apache软件...

    lucene全文检索需要jar包

    **Lucene 全文检索与所需Jar包详解** Lucene 是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高效、可扩展的搜索功能,使得开发者能够在其应用程序中轻松实现复杂的全文检索。在使用Lucene进行全文...

    Lucene全文搜索 分组,精确查找,模糊查找

    《Lucene全文搜索:分组、精确查找与模糊查找详解》 在IT行业中,全文搜索引擎的使用越来越广泛,而Apache Lucene作为一款强大的开源全文检索库,深受开发者们的喜爱。它提供了高效的索引和查询功能,使得在海量...

    Lucene 全文检索实践.pdf

    ### Lucene全文检索实践知识点详解 #### 一、Lucene简介与特性 Lucene是Apache Jakarta项目中的一个子项目,它提供了一套高效、灵活的全文检索解决方案。作为一个开源的文本搜索库,Lucene允许开发者轻松地为各种...

    lucene搜索引擎配置详解

    Lucene是Apache软件基金会的一个开放源代码项目,它是一个全文搜索引擎库,提供了高效、可扩展的信息检索服务。本文将深入探讨Lucene搜索引擎的配置过程,包括文件加载、索引创建和搜索操作,帮助你理解其核心技术。...

    lucene全文检索实例

    **Lucene 全文检索实例详解** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它允许开发者在他们的应用程序中添加高级的搜索功能,支持多种编程语言,包括 Java、Python、C# 和 PHP 等。这个实例...

    基于java的Lucene全文搜索引擎资源简单实例下载

    Lucene是一个由Apache软件基金会开发的开源全文检索库,它为Java开发者提供了强大的文本搜索功能。Lucene是高性能、可扩展的信息检索库,可以集成到各种Java应用中,实现全文索引和搜索功能。本资源包提供了一个简单...

    lucene 全文检索系统 java源码 (信息检索技术)

    **Lucene 全文检索系统:Java 源码与信息检索技术详解** Lucene 是一个高度可定制的全文检索库,由 Apache 软件基金会维护,它为开发人员提供了一个强大的工具来构建搜索功能。这个压缩包包含了 Lucene 的 Java ...

    Lucene开发详解.pdf

    ### Lucene开发详解 #### 一、Lucene简介 Lucene是一个高性能、全功能的文本搜索引擎库,由Doug Cutting创建并捐赠给Apache Software Foundation。它主要用于构建全文搜索应用程序,能够帮助开发者快速地在其应用...

    Lucene分词与查询详解

    3. **索引(Indexing)**:索引是Lucene的核心功能之一,它将文本数据转化为可供快速检索的结构。索引过程涉及构建倒排索引(Inverted Index),其中每个词元都指向包含该词元的文档列表。 4. **查询处理(Query ...

    lucene搜索过程代码详解

    Lucene,作为一款强大的全文搜索引擎库,其搜索机制是其核心功能之一。本文将详细剖析Lucene的搜索实现过程,通过代码解析,帮助读者深入理解其工作原理。 首先,搜索过程始于打开并读取索引文件。这一步骤由`...

    Lucene中文分词源码详解

    Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引 擎,还是论坛中的搜索功能,还是其它C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql...

    全文检索原理及Lucene实之搜索

    Lucene是一个高效且可扩展的全文检索库,它的核心优势在于提供了强大的索引和搜索功能,并且完全使用Java实现,便于集成到Java应用程序中。Lucene适用于纯文本文件的索引和搜索,但需要注意的是,它并不涉及从其他...

Global site tag (gtag.js) - Google Analytics