lucene中的filter其实并不起眼,大家对其对性能的影响也不是很关注,但实际上filter是除了单纯搜索以外,其他搜索附加功能的必选组件,
其性能很大程度上会直接影响搜索的性能,之前我一直认为filter的性能比query高,但事实说明并不完全如此(这里所说的负荷是指io消耗并不是
cpu),实际上在lucene中充满着各种io流,也就是说很多东西都无法从根本上保存,这也给缓存带来了很大难度(这个问题看似简单,但是在超复杂的
组合查询下,缓存可能会几乎无用,原因就是key怎么把握)
首先来看看filter的接口定义:
public abstract class Filter ...
Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下:
0)设有两篇文章1和2
文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.
文章2的内容为:He once lived in Shanghai.
1)由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施
a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。英文单词由于用空格分隔,比较好处理。中文单词间是连在 ...
最新的Lucene2.3.2发布了,主要修改了一些创建和修改索引时候的Bug。
======================= Release 2.3.2 2008-05-05 =======================
Bug fixes
1. LUCENE-1191: On hitting OutOfMemoryError in any index-modifying
methods in IndexWriter, do not commit any further changes to the
index to prevent risk of possible ...
我认为这篇文章作为入门,对Lucene的总结比较好:
1 lucene简介
1.1 什么是lucene
Lucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。
1.2 lucene能做什么
要回答这个问题,先要了解lucene的本质。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要搜索的关键词出现在哪里。知道了这个本质,你就可以发挥想象做任何符合这个条件的事情了。你可以把站内新闻都索引了,做个资料库;你可以把一个 ...
通过Searcher.explain(Query query, int doc)方法可以查看某个文档的得分的具体构成。
在Lucene中score简单说是由 tf * idf * boost * lengthNorm计算得出的。
tf:是查询的词在文档中出现的次数的平方根
idf:表示反转文档频率,观察了一下所有的文档都一样,所以那就没什么用处,不会起什么决定作用。
boost:激励因子,可以通过setBoost方法设置,需要说明的通过field和doc都可以设置,所设置的值会同时起作用
lengthNorm:是由搜索的field的长度决定了,越长文档的分值越低。
所以我们编程能够控制s ...
搜索
1、对于按创建时间的排序可以使用doc.id的方式
new SortField(null, SortField.DOC, reverse)排序方式尽量使用INT类型的字段
也就是按照写入索引的顺序排序
2、对于时间字符串的排序可以转换成整数进行排序
3、去掉不必要的parse
使用TermQuery替换
4、TermQuery和Term可以只保留一个实例
createTerm(text)
5、减少Doc到model的转换
索引出来String到Date的转换多余而且 ...
索引
1、t.termText()替换为new String(t.termBuffer(),0,t.termLength())
2、StringReader 和TokenStream对象都需要close
3、索引时Document只用一个、Field只用几个
一个Document对象对应多个Field实例
Field有新的setValue方法,动态改变属性
不能只有一个Field实例
例如:idField, bodyField
必须等Document都到索引中之后,才可以重新设置值
...
主要是修改了一些2.3.0版本的Bug,特别是当autoCommit=false的情况下以及多线程添加Document,有些字段打开了term-vector有些没有打都会对索引数据造成破坏
autoCommit 选项是从2.2.0版本就添加了,默认是true,我对这个参数还不是很理解,都是用的默认值true。所以没有碰到问题。
2.3.1版本没有包含任何新的功能,索引文件的格式也没有变化,完全兼容2.3.0版本。
官方鼓励所有使用2.3.0版本的应用尽快升级到2.3.1版本。
Bug fixes
1. LUCENE-1168: Fixed corruption cases ...
发现2.1里面的新变化很多都用到了,而且帮助很大。所以决定把2.2的新内容消化一下
1、在InderWriter的构造参数中增加了一个可选的boolean的参数autoCommit。默认是true,当设置成false的时候,索引的变化知道writer被close掉之后,才会提交变化。
还有一个可选的删除策略的参数,应该是用来控制删除索引后是否生效。
2、很多public的方法都会抛出:AlreadyClosedException
3、TokenStream里面增加了reset()方法,允许提供自定义的实现。
未完待续,还有很多需要进一步消化。
1.9 到 2.0 的改动不是很多,主要是废弃了一些 API , 2.0 起了一个过渡的作用。
2.1 是在 2.0 基础上做了很多的改进,提升了性能,修复了一些 Bug 等。
Lucene2.1 在索引的格式上做了一些改进,所以旧版本的 Lucene 是无法访问 2.1 版的索引文件。但是 2.1 版本的可以读写旧版本的索引文件。保持向下的兼容性。这点需要我们在使用时注意。
下面简单的列出一些新的特性:
1. 's' 和 't' 从默认的 stopwords 中移掉了。但是依然还有 'a' 也可以会有同样的问题,所以分词需要针对自己的应用进行自定 ...
org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024 at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:165) at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:156) at org.apache.lucene.searc ...
1.9 到 2.0 的改动不是很多,主要是废弃了一些 API , 2.0 起了一个过渡的作用。 2.1 是在 2.0 基础上做了很多的改进,提升了性能,修复了一些 Bug 等。 Lucene2.1 在索引的格式上做了一些改进,所以旧版本的 Lucene 是无法访问 2.1 版的索引文件。但是 2.1 版本的可以读写旧版本的索引文件。保持向下的兼容性。这点需要我们在使用时注意。 下面简单的列出一些新的特性: 1.'s' 和 't' 从默认的 stopwords 中移掉了。但是依然还有 'a' 也可以会有同样的问题,所以分词需要针对自己的应用进行自定义。 2.更新了 Sta ...
- 浏览: 54665 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Lucene的评分(score)机制 ...
顶楼主一下。 很早就在做这块的实验了,lucene的score机制更面向与算法数 ...
-- by linliangyi2007 -
Lucene的评分(score)机制 ...
lot1 写道grantbb 写道 在Lucene中score简单说是由 tf ...
-- by imjl -
Lucene的评分(score)机制 ...
我不知道楼上所说的商业应用是指什么呢?据我所知,很多大的互联网公司都在使用Luc ...
-- by grantbb -
Lucene的评分(score)机制 ...
grantbb 写道 在Lucene中score简单说是由 tf * idf * ...
-- by lot1 -
Tomcat5到Tomcat6的升级 ...
能否给出一个具体的链接呢,我在tomcat的网站左侧属性项中还真是没有找到,见笑 ...
-- by aunox






评论排行榜