- 浏览: 279562 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (161)
- 【**计划】 (2)
- 【**Core Java**】 (30)
- 【**JAVA EE】 (6)
- JDBC (3)
- Hibernate专题系列 (0)
- 【**OS】 (14)
- 【**架构设计/设计模式】 (11)
- 【Hadoop】 (3)
- 【**分布式】 (9)
- 模板 (1)
- C (2)
- 常用工具 (1)
- Oracle (2)
- 【Tips】 (3)
- 【数据库】 (2)
- 玩转Ubuntu (0)
- 【计算机网络/网络编程】 (7)
- 【**Search Engine】 (21)
- 【**专题**】 (6)
- 【**Python】 (10)
- XML (1)
- 【**Open Source Framework】 (1)
- 【高级主题】 (1)
- 【存储】 (3)
- 【笔试面试】 (2)
- 【**数据结构与算法设计】 (20)
- 【其他】 (3)
- 【编程练习】 (2)
- 【待完成】 (12)
- 【工作】 (6)
- 【软件研发】 (4)
- 【**多线程多进程编程】 (5)
- 【Web Service】 (1)
- 【表达式解析/JavaCC系列】 (5)
- 【缓存系统:Memcached】 (1)
- 【Java IO/NIO】 (5)
- 【JVM运行机制及内存管理】 (7)
最新评论
-
107x:
...
python list排序 -
yuzhu223:
...
【Python基础】Python的lambda函数与排序 -
Tonyguxu:
分析查询结果的打分小于11.query=1065800715* ...
lucene打分机制的研究 -
Tonyguxu:
query=139320661963.013709 = (MA ...
lucene打分机制的研究 -
Tonyguxu:
query=10658007150.6772446 = (MA ...
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对象)进行搜索的模块。
当能确保索引是不可变的话,出于性能考虑,建议将IndexSearcher缓存起来
写道
问题1:程序是怎么得知索引是否变化的?
获得 IndexSearcher 实例
1.Directory --> IndexReader --> IndexSearcher
2.Directory --> IndexSearcher
Term
TopDocs
搜索结果排序:相关性评分(默认):每个结果文档与查询条件的匹配程度进行排序。
其他评分策略
ScoreDoc
发表评论
-
【Lucene】建索引核心类介绍
2012-06-08 17:28 1065IndexWriter 负责创建新索引或打开已有索引, ... -
优秀文章汇总
2012-05-08 18:48 776搜索引擎技术之概要预览 http://blog.csd ... -
【Lucene】lucene查询Query对象
2012-05-08 18:41 1418PrefixQuery 前缀查询。 如 test* 会匹配 ... -
如何阅读、理解别人的代码orframework
2012-05-08 13:51 833======我的总结======= === ... -
【工作】日志检索结果的排序改进分析
2012-04-27 18:07 965下图是现在生产环境的部署图,索引文件分布在70-7 ... -
【Lucene】查询term后加上'*'对打分的影响
2012-04-25 18:14 2101BooleanWeight里sum ... -
lucene.search.Weight
2012-04-25 15:39 998org.apache.lucene.search Cl ... -
lucene.search.Similarity
2012-04-20 10:31 2558Similarity defines the componen ... -
lucene打分机制的研究
2012-04-22 17:46 5863提出问题 目前在查询时,会将得分小于1的查询结果过滤掉。 ... -
tokenize和tokenizer到底怎么翻译?
2012-03-28 10:32 3582在编写词法分析器(Lexer)或语法分析器(Parse ... -
【UML】交互、交互图
2012-03-27 18:19 1203基本行为建模:交互、交互图 术语和概念 ... -
【Lucene】更合理地使用Document和Field
2012-03-27 09:39 5448writer = ...; //#1 Prepared ... -
【Lucene】构建索引
2012-03-17 23:16 770Lucene索引的过程是什么? step1 收集待 ... -
信息检索类小程序
2012-03-17 00:37 8531.对四大名著txt实现索引和搜索功能 2. -
【Java Framework】模板引擎velocity(2)
2012-03-15 19:05 835StringResourceLoader http:/ ... -
决策表管理系统
2012-03-15 18:46 842主题: 1.模板引擎(Velocity) 见 ... -
【Lucene】Scoring
2012-03-13 23:47 1174http://lucene.apache.org/core/o ... -
Information Retrieval
2012-03-13 22:50 1011http://wiki.apache.org/lucene-j ... -
tianya数据分析
2012-03-09 09:49 1086源文件数据格式:用户名 密码 注册邮箱 共 条记录,分别存储 ... -
WXXR 微内核模式
2012-03-08 18:38 118612
相关推荐
- `IndexSearcher`:执行搜索操作的核心类,可以接受Query对象并返回匹配的文档集。 - `Query`:代表用户输入的搜索条件,如TermQuery、BooleanQuery、PhraseQuery等。 - `ScoreDoc`和`TopDocs`:用于存储搜索...
这里的"lucene3.0核心jar包"是 Lucene 的一个重要版本,发布于2009年,为当时的开发人员提供了构建全文搜索引擎的基础框架。 在 Lucene 3.0 中,以下几个关键知识点值得关注: 1. **索引结构**:Lucene 使用倒排...
Lucene的核心功能包括文档的索引和查询。在示例中,`lucene.html`展示了一个简单的HTML表单,用户可以输入关键字进行搜索。当用户点击“提交”按钮时,数据会通过POST方法发送到`search.jsp`页面进行处理。 在`...
Lucene的核心功能包括文本分析、索引构建和查询解析。它首先对输入的文档进行分词,然后将这些词语转换为倒排索引,便于快速查找。倒排索引是一种数据结构,它允许快速定位到包含特定词语的文档。 **2. JSP (Java...
在本篇文章中,我们将深入探讨Lucene 3.6版本中的搜索功能,通过实例解析其核心概念和操作流程。 一、Lucene概述 Lucene的出现,使得开发人员能够轻松地在他们的应用中添加高级搜索功能。作为一个高性能的信息检索...
首先,我们要了解Lucene的核心概念。Lucene通过建立倒排索引来实现快速文本搜索。倒排索引是一种数据结构,它将文档中的每个词映射到包含该词的所有文档的列表。当用户输入查询时,Lucene会快速定位到包含这些查询词...
Lucene的核心目标是让开发者能够快速地在应用中集成高级的搜索功能,使得用户可以轻松地查找和定位所需的信息。 Lucene的特性包括: 1. **高性能**:Lucene采用了高效的索引和搜索算法,能够在海量数据中迅速找到...
《Lucene核心库2.9.4版本解析与应用》 在信息检索和文本处理领域,Apache Lucene是一个广泛使用的开源全文搜索引擎库。标题中的"lucene-core-2.9.4.jar.zip"是一个包含Lucene核心库2.9.4版本的压缩文件,它在Java...
全文搜索引擎的核心在于能够对文本进行深入的分析和索引,以便快速响应用户的查询。在Lucene中,这个过程分为以下几个步骤: 1. **索引创建**:首先,Lucene会爬取或接收输入的数据源,例如网站内容。数据源可以是...
1. **Lucene核心概念**:理解Lucene的工作原理,包括分词器、分析器、索引和查询解析器等。 2. **创建索引**:在Lucene中,我们需要先创建索引,这是搜索的基础。这个过程涉及将文本数据转换成可搜索的结构。 3. *...
**正文** Lucene 是一个高性能、全文本搜索库,由 Apache...通过该课程,你不仅可以掌握 Lucene 的核心功能,还能了解到如何在实际场景中发挥其实时搜索的优势。无论你是初学者还是有经验的开发者,都能从中受益匪浅。
- `lucene-core-3.1.0.jar`:Lucene的核心组件。 - `lucene-analyzers-3.1.0.jar`:提供文本分析工具,如分词器。 - `lucene-highlighter-3.1.0.jar`:高亮显示搜索结果中的关键词。 2. **创建索引**: - 使用`...
Lucene的核心功能是文本分析和索引构建,以及高效的搜索算法。它能将非结构化的文本数据转化为结构化的索引,以便于快速查询。索引过程中,Lucene会进行分词、去除停用词等预处理操作,然后构建倒排索引。在搜索时,...
总的来说,基于Lucene的财经类搜索引擎是一个复杂而实用的系统,它将先进的信息检索技术应用于金融领域的信息检索,提升了数据的可获取性和分析效率。对于开发者来说,理解并掌握Lucene的原理和实践,对提升自身在...
**Lucene核心概念:** 1. **索引(Indexing)**:Lucene通过分析文本,将其转化为一系列可搜索的项,这个过程称为索引。索引包含了文档的关键信息,如词项(Term)、词项频率(Term Frequency)和位置信息等。 2. **...
该项目是一款基于Spring Boot和Lucene核心库构建的Lucene Server搜索引擎设计源码,包含300个文件,涵盖163个Java源文件、27个Vue组件、21个PNG资源文件、18个类文件、16个XML配置文件、8个DLL库文件、7个JavaScript...
Lucene的核心特性包括分词、文档索引、搜索算法(如TF-IDF)以及结果排序。通过Lucene,开发者可以构建自己的全文搜索引擎,支持高效的全文检索、布尔查询、短语查询等。 **2. ShootSearch优化** ShootSearch对原始...
"lucene基础jar包"指的是包含Lucene核心组件的基础Java档案(JAR)文件集合,这些文件是构建基于Lucene的搜索应用所必需的。 Lucene 的核心功能包括: 1. **索引创建**:Lucene 提供了对文本数据进行高效索引的...
Lucene的核心是建立索引,将原始文本数据转化为结构化的、便于查询的数据结构。这个过程包括文本分析(Tokenization)、词干提取(Stemming)、去停用词(Stopword Removal)等步骤。在这个例子中,我们采用庖丁解牛...