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

【Lucene】搜索的核心类简介

 
阅读更多

注:Lucene版本为3.4

 

IndexReader

IndexSearcher

Term

QueryParser

Query

TermQuery

TopDocs

ScoreDoc

 

搜索的基本类:Directory IndexReader IndexSearcher


图1 搜索使用到的各个类的相互关系

 

QueryParser

QueryParser负责将用户输入的查询表达式(见 Apache Lucene - Query Parser Syntax)转换成对应的Query实例。

过程中需要一个分析器将表达式分割成多个项(分析器 is used to find terms in the query text)。

注意: QueryParser 是搜索过程中用到分析器的唯一类

 

简单的使用:

 

import org.apache.lucene.queryParser.QueryParser;

//content为defaultField默认搜索域
QueryParser parser = new QueryParser(Version matchVersion, "content", Analyzer a);

//默认搜索域为上面构造中指定的defaultField,在表达式中也可以指定field,如//field:expression
Query query = parser.parse(String queryExpression);

 

 

Query

 

TermQuery

 

 

IndexReader

IndexReader is an abstract class, providing an interface for accessing an index. Search of an index is done entirely through this abstract interface, so that any subclass which implements it is searchable.

 

1. 打开一个reader需要较大的系统开销,建议重复使用同一个IndexReader实例(将某目录的IndexReader实例缓存),

只有在必要的时候才打开新的(见第2条)。

2. 何时打开一个新的reader:在创建IndexReader时,会搜索已有的索引快照,如果在这(生成了reader实例)之后又有线程往索引中增加或者删除了,若要看到这些更改,必须打开一个新的reader。

 

boolean isCurrent() 
          Check whether any new changes have occurred to the index since this reader was opened.

 

IndexReader reader = ..
IndexSearcher searcher = ..
IndexReader newReader = reader.reopen();
if(newReader != null){
    reader.close();
    reader = newReader;
    searcher = new IndexSearcher(reader);
}

 注意:实际应用中,多线程可能还在使用这个旧的reader在搜索,必须保证上面这段代码是线程安全的。完善上面代码

 

3. 通过IndexWriter来获得IndexReader,参见 near real time search

 

//IndexReader类
public static IndexReader open(IndexWriter writer,
                               boolean applyAllDeletes)
                        throws CorruptIndexException,
                               IOException

 applyAllDeletes - If true, all buffered deletes will be applied (made visible) in the returned reader. If false, the deletes are not applied but remain buffered (in IndexWriter) so that they will be applied in the future. Applying deletes can be costly, so if your app can tolerate deleted documents being returned you might gain some performance by passing false.

 

4.通过Directory来获得IndexReader

 

//IndexReader类
public static IndexReader open(Directory directory,
                                                   boolean readOnly)
                        throws CorruptIndexException,
                               IOException

 

获得IndexReader实例时设置ReadOnly:should pass readOnly=true, since it gives much better concurrent performance, unless you intend to do write operations (delete documents or change norms) with the reader.

实践中,我们使用IndexWriter里的deleteDocuments来删除索引中documents,

 

 

 

代码示例:IndexFileManagerImpl

 

下面代码中从如下顺序获取IndexReader实例,首先从reader的cache里获取,如果没有则尝试通过该索引目录的IndexWriter获取,再没有则直接Directory获得。

 

public IndexReader getIndexReader(String name) throws IOException {
        Lock lock = rwLock.readLock();
        lock.lock();
        try {
            IndexReader reader = readerCache.get(name);
            if (reader == null) {
                lock.unlock();
                lock = rwLock.writeLock();
                lock.lock();
                IndexWriter writer = writerCache.get(name);
                if (writer != null) {
                    reader = IndexReader.open(writer, false); // get parallel reader, deletes would not apply at this moment
                } else {
                    File dir = new File(rootDir, name);
                    if (dir.exists()) {
                        if(isWinOS)
                            reader = IndexReader.open(FSDirectory.open(dir), true); // read only reader
                        else
                            reader = IndexReader.open(NIOFSDirectory.open(dir), true); // read only reader
                    } else {
                        reader = null; // if the specific index files are not existing yet
                    }
                }
                if (reader != null) {
                    readerCache.put(name, reader);
                }
            }
            return reader;
        } finally {
            lock.unlock();
        }
    }
 

以上为IndexReader的基本用法,对其他更深入的知识点后续研究


IndexSearcher

根据查询条件(Query对象)进行搜索的模块。

 

 API 写道
For performance reasons, if your index is unchanging, you should share a single IndexSearcher instance across multiple searches instead of creating a new one per-search.
当能确保索引是不可变的话,出于性能考虑,建议将IndexSearcher缓存起来

             写道

If your index has changed and you wish to see the changes reflected in searching, you should use IndexReader.reopen() to obtain a new reader and then create a new IndexSearcher from that.

问题1:程序是怎么得知索引是否变化的? 

 

 

 

获得 IndexSearcher 实例

1.Directory --> IndexReader --> IndexSearcher

2.Directory -->  IndexSearcher

 

 

Term

 

 

TopDocs

搜索结果排序:相关性评分(默认):每个结果文档与查询条件的匹配程度进行排序。

其他评分策略

ScoreDoc

  • 大小: 13.1 KB
分享到:
评论

相关推荐

    lucene包,lucene实现核心代码

    - `IndexSearcher`:执行搜索操作的核心类,可以接受Query对象并返回匹配的文档集。 - `Query`:代表用户输入的搜索条件,如TermQuery、BooleanQuery、PhraseQuery等。 - `ScoreDoc`和`TopDocs`:用于存储搜索...

    lucene3.0核心jar包

    这里的"lucene3.0核心jar包"是 Lucene 的一个重要版本,发布于2009年,为当时的开发人员提供了构建全文搜索引擎的基础框架。 在 Lucene 3.0 中,以下几个关键知识点值得关注: 1. **索引结构**:Lucene 使用倒排...

    Lucene搜索引擎 JSP + JAVA

    Lucene的核心功能包括文本分析、索引构建和查询解析。它首先对输入的文档进行分词,然后将这些词语转换为倒排索引,便于快速查找。倒排索引是一种数据结构,它允许快速定位到包含特定词语的文档。 **2. JSP (Java...

    lucene3.6 搜索例子

    在本篇文章中,我们将深入探讨Lucene 3.6版本中的搜索功能,通过实例解析其核心概念和操作流程。 一、Lucene概述 Lucene的出现,使得开发人员能够轻松地在他们的应用中添加高级搜索功能。作为一个高性能的信息检索...

    lucene 搜索中文PDF文档

    首先,我们要了解Lucene的核心概念。Lucene通过建立倒排索引来实现快速文本搜索。倒排索引是一种数据结构,它将文档中的每个词映射到包含该词的所有文档的列表。当用户输入查询时,Lucene会快速定位到包含这些查询词...

    Java搜索引擎 Lucene

    Lucene的核心目标是让开发者能够快速地在应用中集成高级的搜索功能,使得用户可以轻松地查找和定位所需的信息。 Lucene的特性包括: 1. **高性能**:Lucene采用了高效的索引和搜索算法,能够在海量数据中迅速找到...

    lucene-core-2.9.4.jar.zip

    《Lucene核心库2.9.4版本解析与应用》 在信息检索和文本处理领域,Apache Lucene是一个广泛使用的开源全文搜索引擎库。标题中的"lucene-core-2.9.4.jar.zip"是一个包含Lucene核心库2.9.4版本的压缩文件,它在Java...

    Lucene 搜索方法(多短语搜索)

    1. **Lucene核心概念**:理解Lucene的工作原理,包括分词器、分析器、索引和查询解析器等。 2. **创建索引**:在Lucene中,我们需要先创建索引,这是搜索的基础。这个过程涉及将文本数据转换成可搜索的结构。 3. *...

    Lucene 实时搜索视频详解

    **正文** Lucene 是一个高性能、全文本搜索库,由 Apache...通过该课程,你不仅可以掌握 Lucene 的核心功能,还能了解到如何在实际场景中发挥其实时搜索的优势。无论你是初学者还是有经验的开发者,都能从中受益匪浅。

    lucene全文搜索

    - `lucene-core-3.1.0.jar`:Lucene的核心组件。 - `lucene-analyzers-3.1.0.jar`:提供文本分析工具,如分词器。 - `lucene-highlighter-3.1.0.jar`:高亮显示搜索结果中的关键词。 2. **创建索引**: - 使用`...

    lucene全文搜索ajax例子

    Lucene的核心功能是文本分析和索引构建,以及高效的搜索算法。它能将非结构化的文本数据转化为结构化的索引,以便于快速查询。索引过程中,Lucene会进行分词、去除停用词等预处理操作,然后构建倒排索引。在搜索时,...

    基于Lucene的搜索引擎

    总的来说,基于Lucene的财经类搜索引擎是一个复杂而实用的系统,它将先进的信息检索技术应用于金融领域的信息检索,提升了数据的可获取性和分析效率。对于开发者来说,理解并掌握Lucene的原理和实践,对提升自身在...

    基于lucene搜索引擎的java源码

    **Lucene核心概念:** 1. **索引(Indexing)**:Lucene通过分析文本,将其转化为一系列可搜索的项,这个过程称为索引。索引包含了文档的关键信息,如词项(Term)、词项频率(Term Frequency)和位置信息等。 2. **...

    基于Spring Boot和Lucene核心库的Lucene Server搜索引擎设计源码

    该项目是一款基于Spring Boot和Lucene核心库构建的Lucene Server搜索引擎设计源码,包含300个文件,涵盖163个Java源文件、27个Vue组件、21个PNG资源文件、18个类文件、16个XML配置文件、8个DLL库文件、7个JavaScript...

    基于Lucene的中型搜索引擎(C#)

    Lucene的核心特性包括分词、文档索引、搜索算法(如TF-IDF)以及结果排序。通过Lucene,开发者可以构建自己的全文搜索引擎,支持高效的全文检索、布尔查询、短语查询等。 **2. ShootSearch优化** ShootSearch对原始...

    lucene基础jar包

    "lucene基础jar包"指的是包含Lucene核心组件的基础Java档案(JAR)文件集合,这些文件是构建基于Lucene的搜索应用所必需的。 Lucene 的核心功能包括: 1. **索引创建**:Lucene 提供了对文本数据进行高效索引的...

    lucene实现企业产品检索

    Lucene的核心是建立索引,将原始文本数据转化为结构化的、便于查询的数据结构。这个过程包括文本分析(Tokenization)、词干提取(Stemming)、去停用词(Stopword Removal)等步骤。在这个例子中,我们采用庖丁解牛...

Global site tag (gtag.js) - Google Analytics