- 浏览: 7326152 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
这是很久以前做lucene 时的总结,现在已经不用去研究那些代码,但还是分享出来给大家以帮助。谢谢
1. 从Index开始
无论哪种搜索引擎,都会需要自建一个index,所有的搜词准确率及快速性很大程度上取决于这类的问题。因此在建索引文件的时候,我们首先要弄清楚lucene建索引的接口及各类参数。
Field是lucene的重要组成部分,其引出好些接口
Filed Interf
Name,string
store
index
token
StoreTermVector
Keyword
Y
Y
Y
N
(N)
UnIndexed
Y
Y
N
N
N
Text
Y
*
(Y)
(Y)
N
UnStored
Y
(N)
(Y)
(Y)
*
Text
Y
(Y)
(Y)
(Y)
Y
*()表示多态隐藏参数,当storeTermVector为true, Index必须保证true.
对于Keyword来说String 可以是Date型的,具体会通过DateField里dateToString来实现其功能。
下面是Field构造所带的6个参数。头两个是必须。
* @param name The name of the field
* @param string The string to process
* @param store true if the field should store the string
* @param index true if the field should be indexed
* @param token true if the field should be tokenized
* @param storeTermVector true if we should store the Term Vector info
这里就是Field所存储几个选项,这些在建索引的时候会有一定的作用
Document: Documents是Index和search的单元,也就是Field的集合和组成index的内容,提供加入add(), 去除remove(), 及getField()getFields()的方法。
Document 包括1个参数boost 默认为1.0f,其作用 (参考cap: java搜索引擎lucene学习笔记) luncene对Document和Field提供了一个可以设置的Boost参数, 这个参数的用处是告诉lucene, 某些记录更重要,在搜索的时候优先考虑他们。 lucene默认的boost参数是1.0, 如果你觉得这个field重要,你可以把boost设置为1.5, 1.2....等。这个boost不会直接和Document,Field存放在Index一起,因此在带Index的时候IndexReader.Documenthit()和Hits.hit() 返回中会不同。
IndexWrite (参考lucene Doc) 主要用于创建和维护index. 构造函数中第三个参数用来控制index文件是不是重建(T)还是添加(F)。 其他方面 addDocument()用于添加document,当Index结束添加时close()必须写上。 如果document不再随意添加,那么可以在index关闭时调用optimize()来对Index进行优化。下面来讨论一下IndexWrite里的基本方法
我们先可以用个简单的程序来建个空Index
IndexWriter writer = new IndexWriter(String|Directory|File, Anaylzer, true|false);
writer.close();
会形成一个索引,这里千万注意,建索引的指定目录下的所有文件都会被不可恢复删除,做索引的文件和索引不要指定在一个目录下。
addDocument() 用来把把document添加到Index里,而addIndexes三()可以把几个子索引集合起来,做成一个总索引。addIndexes()会自动调用optimize()所有使用时不需要再加, 但close()需要手动加上
Directory一个抽象的标示index文件地址的类,有两个实现:FSDirectory和RAMDirectory, 前者是基于文件系统,后者使用内存。 在Lucene Doc里Directory 还提供一种通过jdbc基于数据库内的索引,目前没有提供实现方法,估计后续版本的会出。RAM的方式通过stream方式读到buffer里,速度非常快,但根据我做程序时的经验,在六千条纪录的以上,时常出现java的memory low现象.所以大型的索引,采取FS是必须的。FSDirectory的构造函数是私有的,只有通过FSDirectory.GetDirectoty(File|String, boolean)来获得,而RAMDirectory却可以直接构造或者从FSDirectory来得到。
2. Search 这里似乎是lucene的精华,
Searchable是Search的底层接口, lucene提供了单索引,多索引以及远程的索引3 种方式。
Query是Search的基本单元,实现各种搜索的方法,下面我简单的列一下他们的作用,
TermQuery,
最基本的Query,用TermQuery(new Term(Str filed, Str Text));就可以构造, TermQuery把查询条件视为一个key, 要求和查询内容完全匹配,比如Field.Keyword类型就可以使用TermQuery。
PhraseQuery
表示可用于非严格语句的查询,匹配包含的指定连续Term, 比如"one five"可以匹配"one two three four five"等, PhraseQuery提供了一个重要的setSlop()参数, 这个参数主要用于设置phrase query中词之间的允许间隔数目,在默认情况下slop的值是0, 就相当于TermQuery的精确匹配, 通过设置slop参数(比如"one five"匹配"one two three four five"就需要slop=3,如果slop=2就无法得到结果。这里我们可以认为slope是单词移动得次数,可以左移或者右移。这里特别提醒,PhraseQuery不保证前后单词的次序,在上面的例子中,"two one"就需要2个slop,也就是认为one 向左边移动2位, 就是能够匹配的”one two”如果是“five three one” 就需要slope=6才能匹配。还有一点要注意,就是如果碰到stopword,(会在stopAnalyzer中细说),则stopword不用把slop算在内。
BooleanQuery
是一个组合的Query, 可以把各种Query添加进去(主要是TernQuery和PhraseQuery)并标明他们的逻辑关系,添加条件用public void add(Query query, boolean required, boolean prohibited)方法, 后两个boolean变量分别表示不匹配子Query将不匹配booleanQuery和匹配子Query将不匹配booleanQuery。估计类似google的(+,-)功能。这两个参数不允许同时为true, 否则报错。但两个参数可以都为false,而且必须保证匹配至少一个子query才能用来匹配booleanQuery。 一个BooleanQuery中可以添加多个Query, 但不能超过setMaxClauseCount(int)的值(默认1024个),否则抛出TooManyClauses错误. BooleanQuery可以完成各种逻辑的组合,如and, or 和not的组合。
RangeQuery
RangeQuery表示一个范围的搜索条件,RangeQuery query = new RangeQuery(begin, end, included);最后一个boolean值表示是否包含边界条件本身, begin和end必须满足至少有一个不为null及两者都在同一个field. 这里的Range是以String的compareTo (Str)进行比较。所以熟悉j2se的应该很容易确定Range的范围。
PrefixQuery
表示匹配是以指定字符串开头的匹配查询, 可以用于Keyword形式的查询。一般的在suggestion里对于single word可以使用的,也可用于查询网络结构目录树的数目。
PhrasePrefixQuery
由于PhraseQuery不能很灵活的适应各种的phrase的匹配。比如要搜索”Sony Cam*”, 先可以把add(Term)把Sony放在Term.,然后把使用IndexReader.Terms(Term)匹配以Cam为前缀的词,最后使用PhrasePrefixQuery.add(Term[] terms)把两者加在Query中。这里slope和phraseQuery雷同,仍然起着对phrase的定位作用,addTerm(Term[] terms)内使用ArrayList来保存Term数据,而Phrase使用的是Vector.
WildcardQuery
WildcardQuery和FuzzyQuery是继承MultiTermQuery的,这是他们区别的其他的几种常规Query. Query包含自身全部的匹配,Term由FilteredTermEnum提供,而MultiQuery则是不完全自身的匹配。Term的提供者也不同。
WildcardQuery主要使用?和*来表示一个或多个字母的匹配,值得注意的是,在wildcard中,empty对于?和*也是匹配的,且Query的开头不允许用使用?和*.
注:当使用WildcardQuery时,搜索性能会有很大的下降
FuzzyQuery
能模糊匹配英文单词,这个功能非常有用,大小写敏感。可以使用其构造方法FuzzyQuery(Term term, float minimumSimilarity, int prefixLength)方法,还提供2种默认的0.5相似度,和0的前缀状态。相似度比较时要减去非比较的前缀。然后再比。
例如,用”soni”匹配”sony”设置相似度前缀为0,则相似度为75%,如果前缀为1,则相似度为66.7%.只要高于最小相似度,便能找到。如果词长度不一致,则以Query减去前缀的为准,例如设前缀为1,用”della”来匹配”dell”,相似度75%, 如果”del”来匹配”dell”则相似度只有50%
3.Analyse
下面是几种analyse的分词举例。
"The quick brown fox jumped over the lazy dogs"
WhitespaceAnalyzer:
[The] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
SimpleAnalyzer:
[the] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]
StopAnalyzer:
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
StandardAnalyzer:
[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]
"XY&Z Corporation - xyz@example.com"
WhitespaceAnalyzer:
[XY&Z] [Corporation] [-] [xyz@example.com]
SimpleAnalyzer:
[xy] [z] [corporation] [xyz] [example] [com]
StopAnalyzer:
[xy] [z] [corporation] [xyz] [example] [com]
StandardAnalyzer:
[xy&z] [corporation] [xyz@example.com]
Token
Token其实就是一个Field里面包含的term,一般的token就是独立的word.
TokenStream对token做依次的列举
它有2个子类,Tokenizer和TokenFilter,他们的子类如图所示
几种analyzer的区别
WhitespaceAnalyzer 由空格进行分词
SimpleAnalyzer 由非字母的处分词,并置小写
StopAnalyzer 由非字母处分词,置小写,去除Stopword
StandardAnalyzer 由特定的语法进行分词,包括e-mail,addresses, acronyms, Chinese-Japanese-Korean characters, alphanumerics, and more; 置小写,去除Stopword。
StopWord 可以根据内部的代码可以得到 有以下的一些
"a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "no", "not", "of", "on", "or", "s", "such", "t", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"
当然,你也可以通过你自己的接口去来改变上述默认的值。
发表评论
-
Lucene全文搜索框架
2009-11-09 17:16 36091 lucene简介 1.1 什么是luc ... -
compass的开发應用JPA+Compass整合
2009-10-10 17:21 2495查询结果的高亮显示: 采用的是JPA的注解方式, 首 ... -
Compass 實用中扩展應用
2009-10-10 14:12 29151 Compass中的操作通过CompassSession我 ... -
Spring ,JPA,Compass使用注解开发的博客站内搜索
2009-10-10 12:54 3917当一个网 ... -
Web搜索引擎技术
2009-09-25 13:38 2648一、Web搜索引擎技术综 ... -
搜索引擎技术原理
2009-09-25 13:37 2627一、搜索引擎的分类 ... -
搜索计算的规则
2009-05-15 10:28 2177面向Web应用的网页预处理2003年12月3日(讲稿由张志刚协 ... -
用 Lucene 加速 Web 搜索应用程序的开发
2009-05-02 09:18 20302006 年 9 月 06 日 Lucene 是基于 Jav ... -
用 Lucene 加速 Web 搜索应用程序的开发
2009-05-02 09:17 18302006 年 9 月 06 日 Lucene 是基于 Jav ... -
搜索引擎基本工作原理
2009-05-02 07:48 2041搜索引擎基本工作原理 了解搜索引擎的工作原理对我们 ... -
搜索引擎蜘蛛工作原理
2009-05-02 07:46 2578网站能在搜索引擎被搜 ... -
luence学习的指南文档(五)
2009-03-17 17:00 26606.搜索引擎的性能考虑信息: 索引数字:针对数字的检索 ... -
luence学习的指南文档(三)
2009-03-17 16:58 22633. 使用场合:多个搜索引擎查询的数据结果的合并信息操作:添 ... -
luence学习的指南文档
2009-03-17 16:56 29642.代码使用场合:在搜索引擎检索索引目录的中的信息 /** ... -
luence学习的指南文档
2009-03-17 16:54 2218搜索引擎学习总结(实战和使用场合) 备注以下代码使用的环境为 ... -
揭开神秘面纱,搜索引擎原理浅析
2009-03-17 16:10 1922在浩如烟海的Internet上,特别是其上的Web(World ... -
lucene全文检索应用示例及代码简析
2009-03-17 16:02 2132Lucene是apache软件基金会 jakarta项目组 ... -
关于lucene的学习笔记liui :转关于luncene 内层的研究
2009-03-17 15:59 2410现在已经不用去研究那些代码,但还是分享出来给大家以帮助。谢谢1 ... -
lucene大数据量的动态更新问题解决方式. 用内存
2009-03-17 15:55 4668问题: 目前索引里面已经有1000多万的数据了,现在需要每几分 ... -
lucene 自定义SORT
2009-03-17 15:54 3231如欲转载,请注明作者 ...
相关推荐
**Lucene 学习笔记 1** Lucene 是一个全文搜索引擎库,由 Apache 软件基金会开发。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够在其应用程序中集成高级的搜索功能。本篇学习笔记将深入探讨 Lucene 的...
标题:Lucene学习笔记 描述:Lucene学习笔记,Lucene入门必备材料 知识点: 一、Lucene概述与文档管理策略 Lucene是一款高性能、全功能的文本搜索引擎库,广泛应用于文档检索、全文搜索等场景。为了提升搜索效率...
lucene学习笔记 1 .txt lucene学习笔记 2.txt lucene学习笔记 3 .txt lucene入门实战.txt Lucene 的学习 .txt Lucene-2.0学习文档 .txt Lucene入门与使用 .txt lucene性能.txt 大富翁全文索引和查询的例子...
【Lucene 3.6 学习笔记】 Lucene 是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发。本文将深入探讨Lucene 3.6版本中的关键概念、功能以及实现方法。 ### 第一章 Lucene 基础 #### 1.1 索引部分的核心...
NULL 博文链接:https://kylinsoong.iteye.com/blog/719415
【Lucene学习笔记】 Lucene 是一款开源的全文检索框架,由Apache软件基金会维护,它提供了高效的、可扩展的搜索引擎功能。不同于一个完整的应用程序,Lucene 提供的是一个基础组件,开发者可以将其集成到自己的应用...
### Lucene 3.5 学习笔记 #### 一、Lucene 3.5 基本概念 ##### 1.1 Lucene 概述 **1.1.1 IndexWriter** `IndexWriter` 是 Lucene 中的核心类之一,用于创建或更新索引。它提供了添加文档、删除文档、优化索引等...
《Lucene 3.5 学习笔记》 在信息技术高速发展的今天,搜索引擎技术成为了信息检索的核心工具。Apache Lucene,作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene 3.5版本的相关知识...
《Lucene 3.0 学习笔记(三)与Paoding整合》 在深入了解Lucene 3.0的过程中,我们经常会遇到如何将其与第三方工具进行整合的问题,以提升搜索性能和用户体验。这篇学习笔记主要关注的是将Lucene 3.0与Paoding搜索...
**Lucene 基础学习笔记与源码分析** **一、Lucene 概述** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。它是一个 Java 开发的开源项目,被广泛应用于各种搜索引擎的构建,支持多种编程...
《深入理解Lucene 2.9.1:构建与搜索的全方位解析》 Lucene,作为一款开源的全文搜索引擎库,被广泛应用于各种信息检索场景。本文将详细讲解Lucene 2.9.1版本的核心概念、架构以及索引创建与搜索的流程。 一、...
### Lucene 课堂笔记知识点详解 #### 一、信息检索概览 **1.1 信息检索的概念** 信息检索指的是从海量信息集中筛选出与用户需求相关联的信息。本课程主要探讨文本信息的检索,虽然实际应用中还可能涉及图像、音频...