博主资料

留言 加为好友 收藏

用户名:  zhangxinzhou
来自:  北京 石景山
年龄:  33

个人统计

用户名: zhangxinzhou
等级: 初来乍到
威望: 475
积分: 1019
在线时间: 113 小时
日志总数: 137
评论数量: 1328
访问次数: 684623
建立时间: 2006-09-14
RSS订阅       手机访问

最新评论

文章搜索

文章列表

最近访问的人:

炒股软件
2008-10-08 11:35:03
320JAVA && .NET
2008-09-24 11:16:09
☆笨笨№
2008-09-23 14:41:15
[敞篷帅哥]的赛迪..
2008-08-29 22:02:46
majun
2008-08-19 12:01:30
老虎机上分器
2008-08-14 17:04:03
javaEE
2008-08-12 18:18:21
寒冰
2008-08-11 16:15:45
逆风飞扬
2008-08-05 09:59:30
王仰富/企业IT架构..
2008-08-04 12:47:58

日志文章列表

2007年11月28日 10:51:20

lucene笔记十一: 建索引优化,复杂排序HitCollector,匹配算法

1, 提高建索引的速度

/**
* 在IndexWriter中有一个MERGE_FACTOR参数可以帮助你在构造索引器后根据应用环境的情况充分利用内存减少文件的操作。根据我的使用经验:缺省Indexer是每20条记录索引后写入一次,每将MERGE_FACTOR增加50倍,索引速度可以提高1倍左右。
*/
indexWriter.setMergeFactor(1000);

2, 排序
« 从 汉化 到 国际化 | (回到Blog入口)|(回到首页) | Resin学习笔记 »

Lucene:基于Java的全文检索引擎简介
作者:车东 发表于:2002-08-06 18:08 最后更新于:2007-04-12 11:04
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
http://www.chedong.com/tech/lucene.html
--------------------------------------------------------------------------------
Lucene是一个基于Java的全文索引工具包。

基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史
全文检索的实现:Luene全文索引和数据库索引的比较
中文切分词机制简介:基于词库和自动切分词算法的比较
具体的安装和使用简介:系统结构介绍和演示
Hacking Lucene:简化的查询分析器,删除的实现,定制..

阅读全文>>

类别: 无分类 |  评论(0) |  浏览(1162) |  收藏
2007年11月27日 18:37:48

lucene笔记十 :关于高亮显示和显示部分原始文件的原则

高亮显示查询项

有一个能使搜索引擎变得更友好的办法,那就是向你的用户提供一些搜索命中结果的上下文,而且更为重要的是这样做是非常有用 的。最好的例子就是本系统用户在查找天气Web服务时的搜索结果。如下图1所示,每个命中结果包括了匹配文档的三行左右的内容,并且将查询项高亮显示出 来。通常,我们只需要对搜索项 上下文内容浏览一眼就足以 了解该结果是否值得我们深入地进行研究。




图4.1 高亮显示查询项


Highlighter 最近已经充分升级为一个复杂而灵活的工具。Highlighter包括了三个主要部分:段划分器(Fragmenter)、计分器(Scorer)和格式 化器(Formatter)。这几个部分对应于Java的同名接口,并且每部分都有一个内置的实现以便我们使用。最简单的Highlighter将返回在 匹配项周围的最佳段落,并使用HTML的<B>将这些项标记出来:

String text = “The quick brown fox jumps over the lazy dog”;
TermQuery query = new TermQuery(new Term(“field”, “fox”));
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(scorer);
TokenStream tokenStream =
new SimpleAnalyzer().tokenStream(“..

阅读全文>>

类别: 无分类 |  评论(2) |  浏览(1435) |  收藏
2007年11月27日 17:59:03

lucene学习笔记九, 关于结果分页

一 ,Hits对象是搜索结果的集合 主要有下面几个方法 [list=1]length() ,这个方法记录有多少条结果返回(lazy loading) doc(n) 返回第n个记录 id(in) 返回第n个记录的Document ID score(n) 第n个记录的相关度(积分)由于搜索的结果一般比较大,从性能上考虑,Hits对象并不会真正把所有的结果全部取回,默认情况下是保留前100个记录(对于一般的搜索引擎,100个记录足够了).
分页的处理
100条记录还是太多,我们多半会每页显示20条记录,然后分为若干页显示,对于分页,一般有两个办法
[list=1]在session中保留indexreader对象和hit对象,翻页的时候提取内容 不使用session,每次都简单处理为重新查询lucene推荐先使用第二个办法,即每次都重新查询,这样做的好处是简单方便,不需要考虑session的问题,lucene的查询效率也能保证每次查询时间不长,除非真正有了性能问题,否则不用考虑第一个办法。


Lucene面向全文检索的优化在于首次索引检索后,并不把所有的记录(Document)具体内容读取出来,而起只将所有结果中匹配度最高的头100条结果(TopDocs)的ID放到结果集缓存中并返回,这里可以比较一下数据库检索:如果是一个10,000条的数据库检索结果集,数据库是一定要把所有记录..

阅读全文>>

Tags: 分页 lucene  

类别: 无分类 |  评论(0) |  浏览(1362) |  收藏
2007年11月26日 20:34:24

lucene学习笔记八 分词

1, Lucene的结构框架:
  注意:Lucene中的一些比较复杂的词法分析是用JavaCC生成的(JavaCC:JavaCompilerCompiler,纯Java的词法分析生成器),所以如果从源代码编译或需要修改其中的QueryParser、定制自己的词法分析器,还需要从https://javacc.dev.java.net/下载javacc。
  lucene的组成结构:对于外部应用来说索引模块(index)和检索模块(search)是主要的外部应用入口。 org.apache.Lucene.search/ 搜索入口
org.apache.Lucene.index/ 索引入口
org.apache.Lucene.analysis/ 语言分析器
org.apache.Lucene.queryParser/ 查询分析器
org.apache.Lucene.document/ 存储结构
org.apache.Lucene.store/ 底层IO/存储结构
org.apache.Lucene.util/ 一些公用的数据结构

2, 关于计划于词库的分词和一元分词,二元分词的区别. noise.chs 是词库中作为stopword而存在的.请大家注意.
下面做了详细描述:

2006年01月22日 星期日 于 2:39 am · 发表在: 默认

Lucene应用越来越多,在对中文对索引过程中,中文分词问题也就越来越重要。

在已有的分词模式中,目前比较常用的也是比较通用的有一元分词、二元分词和基于词库的分词三种。一元分词在Java版本上由yysun实..

阅读全文>>

Tags: lucene 分词  

类别: 无分类 |  评论(0) |  浏览(1115) |  收藏
2007年11月26日 20:11:00

lucene学习笔记七: 几个问题.

1, 被搜索的结果中,如何取得关键字周围的数据. 例如获取第一个关键字后面的数据.例如一段字符:

我爱北京天安门,你喜欢吗.

我搜:北京
获取结果如何获取: 北京天安门 .
不要用substring或者正则解决了.那样对于大文本不是解决方案. 因为这个数据没必要全取出来

网上也有人问: 做全文检索时,想把查询到的附近的一段文本提取出来,像google那样,如何才能使性能根好? 感觉indexof substring这些东性能会很差,如果是很大的文本 不知道大家有什么根好的办法,获取什么其它组件?

按照在 term vectors 中增加了 位置和偏移信息。(Grant Ingersoll & Christoph)的bug修改后的提示.应该可以找到.

2, 高亮显示. 下面有一例子说明. 顺便把2.0的那个bug说明也贴到下面
Lucene 中文分词的 highlight 显示

下面这个需要外的包: lucene-highlighter-2.2.0.jar 支持.请下载. 否则里面关于高亮显示的都不会编译成功. 下面程序是没有问题的.结果也对.就是有版主说的问题.

lucene2.0 中文高亮的问题。新手问老问题,知道的大虾赐教:

代码:
public static void main(String[] args) {
try {
String text="上海麦为公贸易发展有限公司";
StandardAnalyzer ss..

阅读全文>>

Tags: 高亮  

类别: 无分类 |  评论(0) |  浏览(1102) |  收藏
2007年11月26日 18:22:12

关于lucene的学习笔记liui :转关于luncene 内层的研究

(飞刀和雨)




这是很久以前做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..

阅读全文>>

类别: 无分类 |  评论(0) |  浏览(841) |  收藏
2007年11月24日 19:44:23

lucene学习笔记五

1, 在公司lucene就把我的机器搞死了. 也不知道是什么bug
今天在家,又出现了一次. 最后给出的提示是:
严重: Exception invoking periodic operation:
java.lang.OutOfMemoryError: PermGen space
得详细研究.谁如果知道,可以回复我的帖子.

阅读全文>>

类别: 无分类 |  评论(1) |  浏览(863) |  收藏
2007年11月24日 19:12:53

lucene学习笔记四

1, 几种span的querySpanTermQuery:检索效果完全同TermQuery,但内部会记录一些位置信息,供SpanQuery的其它API使用,是其它属于SpanQuery的Query的基础。
SpanFirstQuery:查找方式为从Field的内容起始位置开始,在一个固定的宽度内查找所指定的词条。
SpanNearQuery:功能类似PharaseQuery。SpanNearQuery查找所匹配的不一定是短语,还有可能是另一个SpanQuery的查询结果作为整体考虑,进行嵌套查询。
SpanOrQuery:把所有SpanQuery查询结果综合起来,作为检索结果。
SpanNotQuery:从第一个SpanQuery查询结果中,去掉第二个SpanQuery查询结果,作为检索结果。

2, 多条件索引关系

BooleanClause用于表示布尔查询子句关系的类,包括:BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHOULD。有以下6种组合:
1.MUST和MUST:取得连个查询子句的交集。
2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。
3.MUST_NOT和MUST_NOT:无意义,检索无结果。
4.SHOULD与MUST、SHOULD与MUST_NOT:SHOULD与MUST连用时,无意义,结果为MUST子句的检索结果。与MUST_NOT连用时,功能同MUST。
5.SHOULD与SH..

阅读全文>>

Tags: lucene  

类别: 无分类 |  评论(0) |  浏览(878) |  收藏
2007年11月23日 22:50:39

lucene学习笔记三 各种query

1, 有时对于一个Document来说,有一些Field会被频繁地操作,而另一些Field则不会。这时可以将频繁操作的Field和其他Field分开存放,而在搜索时同时检索这两部分Field而提取出一个完整的Document。   这要求两个索引包含的Document的数量必须相同。
在创建索引的时候,可以同时创建多个IndexWriter,将一个Document根据需要拆分成多个包含部分Field的Document,并将这些Document分别添加到不同的索引。
而在搜索时,则必须借助ParallelReader类来整合。
Directory dir1=FSDirectory.getDirectory(new File(INDEX_DIR1),false);
Directory dir2=FSDirectory.getDirectory(new File(INDEX_DIR2),false);
ParallelReader preader=new ParallelReader();
preader.add(IndexReader.open(dir1));
preader.add(IndexReader.open(dir2));
IndexSearcher searcher=new IndexSearcher(preader);
之后的操作和一般的搜索相同。

2, Query的子类. 下面的几个搜索在各种不同要求的场合,都会用到. 需要大家仔细研读!

Query query1 = new TermQuery(new Term(FieldValue, "name1")); // 词语搜索
Query query2 = new WildcardQuery(new Term(FieldName, "n..

阅读全文>>

Tags: lucene性能   Filter   query  

类别: 无分类 |  评论(0) |  浏览(1523) |  收藏
2007年11月23日 18:20:53

lucene学习笔记二. 1.9版本升级的问题.

Lucene 1.9 改进特性列表1.9 RC1
注:lucene2.0发布版本并不是100%的和1.4.3版兼容。也就是说在你用2.0版本的Lucene开发包替换原来的1.4.3版本时,应该让你的应用程序首先和1.9的兼容。
使用前提:
1. 编译和使用Lucene需要 Java1.4 或以上版本。
Lucene 1.9 在运行时的变化:
1. 模糊搜索 FuzzyQuery 不再抛出 TooManyClauses 异常。当 FuzzyQuery 扩展多于 BooleanQuery.maxClauseCount 时 ,只有最相关的term会被重新写入query,因此避免了异常的抛出。   (Christoph)
2. 把系统属性 "org.apache.lucene.lockdir" 改为   "org.apache.lucene.lockDir"。(Bernhard)

1.9 RC1
注:lucene2.0发布版本并不是100%的和1.4.3版兼容。也就是说在你用2.0版本的Lucene开发包替换原来的1.4.3版本时,应该让你的应用程序首先和1.9的兼容。
使用前提:
1. 编译和使用Lucene需要 Java1.4 或以上版本。
Lucene 1.9 在运行时的变化:
1. 模糊搜索 FuzzyQuery 不再抛出 TooManyClauses 异常。当 FuzzyQuery 扩展多于 BooleanQuery.maxClauseCount 时 ,只有最相关的term会被重新写入query,因此避免了异常的抛出。   (Christoph)
2. 把系统..

阅读全文>>

Tags: lucene  

类别: 无分类 |  评论(0) |  浏览(1030) |  收藏
2007年11月23日 17:37:38

关于lucene的笔记一 记录开始

这个东西在2006年初,我就开始在项目中使用.我对它也有了一些了解. 但因为主要开发还是小兵们在做. 所以仅仅了解了一些皮毛. 下面我将以知识点的形式, 列出来. 以笔记的形式连载. 也方便大家一起学习. 每一个点, 我都会写一个知识点.

1, 2005年的时候, 听说了lucene. 是一个开源的搜索引擎开发包. 而不是一个搜索引擎,请切记.
2, 如果开始学习它, 就需要至少知道,它所包含的包. 目前lucene已经到了2.2版本. 当然你需要时刻关注他的最新版本. 目前包: lucene-core-2.2.0.jar . 下载可以到apache的网站上下载. 这一个就够了.不用下别的.
3, 下面问题会接踵而至, 我挨着写,你挨着看即可.
分词. 第一个要涉及的问题, 分词就是将一句话中的关键词汇分离出来, 然后才可以建立索引. 例如 中华人民共和国 --> 中华, 中华人民 华人,人民, 共和国,等. lucene缺省带了一个标准分词的类: StandardAnalyzer 这个按字来分的. 从网上发现了很多程序员写的开源的分词的类. 当然都是继承了lucene的org.apache.lucene.analysis.Analyze类. 以实现更好更快的分词效果. 可以搜索获取更多, 一般分词的类,都提供了可检测分词效果的方法. 输入一个长句, 然后执行,看看分词效果和执行时间.

..

阅读全文>>

类别: 无分类 |  评论(1) |  浏览(2151) |  收藏
2007年11月19日 17:28:27

12580.

12580. 用心诠释她的意义吧.

一直希望找到一个值得奋斗的目标.

价值是互相体现的.

她会因你的努力而辉煌, 你会因他的辉煌而骄傲.

已经准备好了后半生的努力.

不会错.

阅读全文>>

类别: 无分类 |  评论(0) |  浏览(685) |  收藏
2007年11月19日 17:03:53

EJB3.0 的例子下载地址. 希望大家能学习.


http://www.foshanshop.net/sourcecode/Book-SourceCode.rar

阅读全文>>

类别: 无分类 |  评论(0) |  浏览(693) |  收藏
2007年11月15日 16:28:52

关于技术管理

一直写了不少的技术备忘. 不想忘记他们是出于对技术的热爱. 曾经的delphi的很多东西,现在用的少了.也就慢慢的淡忘了.最甚的就是delphi控件的安装程序开发. 要更改很多注册表. 研究了很久才知道的. 可惜现在都只能从源代码中才能找到些路子. 还有就是eclipse得插件开发. 中企那会研究的向导型插件. 已经可以做到很好的程度了.可惜后来不用了. 现在只有些翻译好的文档,已经贴在了博客上哦.
所以技术的管理.是非常重要的. 这个不仅仅要从个人层面来管理.更重要的是从公司层面来管理. 至少让来到这个公司的人, 都应是他的知识加上公司已经有的知识. 而不至于总是依赖于个人那点东西. 很多都被老员工带走了..实在是不对.
技术管理分为以下几个方面:
1, 公共技术知识管理.
公共技术知识管理是对公司所有技术员工智力劳动的积累管理. 所有员工的开发的共享技术都要放入到公共技术库来管理. 这个是源代码格式的. 所以不必都是工程.只要按照自己的技术存储即可. 可以是压缩包.等. 但.必须有足够的说明. 后来人才可以能看到. 利用上. 这个公共技术说明任何人可以查询到. 只有你需要的时候,这个就可以让你找到.

2, 正规..

阅读全文>>

类别: 无分类 |  评论(1) |  浏览(1104) |  收藏
2007年11月13日 13:59:33

sqlserver的类似mysql的limit

String tablename, String keyword,
           int pageindex, int pagenum, int sortby

   

String sql = "     SELECT TOP " + pagenum + " * " + "     FROM "
               + tablename + "     WHERE (id NOT IN " + "     (SELECT TOP "
               + (pagenum * (pageindex - 1)) + " id " + "     FROM "
               + tablename + " where keyword='" + keyword + "'"
               + "     ORDER BY " + orderby + " DESC)) " + "    and keyword='"
               + keyword + "' ORDER BY " + orderby + " DESC ";
       

阅读全文>>

类别: 无分类 |  评论(0) |  浏览(847) |  收藏
2007年11月09日 18:18:43

转: lucene的例子.请学习的朋友来看看.

关于 lucene2.0 的创建、检索和删除功能的完整实现

lucene2.2.0 下载地址: http://apache.mirror.phpchina.com/lucene/java/lucene-2.2.0.zip

最近要做一个站内的全文检索功能,主要是针对 clob 字段的,于是去网上找了点 lucene 的资料,现在新版本的是 2.0.0 ,网上的例子多是 1.4.3 的,有些方法已经废弃了,搞了 n 久终于把 2.0.0 的功能实现了,呵呵,下面把实现的代码贴出来,实现了索引的创建、检索和删除功能,并可以从检索结果去查询数据库 ~

// 创建索引

public void indexFiles() {

// 创建索引文件存放路径

File indexDir = new File("E:\\lucene_Learning\\lucene-2.0.0src\\src\\demo\\index");



try {

Date start = new Date();

// 创建分析器 , 主要用于从文本中抽取那些需要建立索引的内容 , 把不需要参与建索引的文本内容去掉 .

// 比如去掉一些 a the 之类的常用词 , 还有决定是否大小写敏感 .

StandardAnalyzer standardAnalyzer = new StandardAnalyzer();

// 参数 true 用于确定是否覆盖原有索引的

IndexWriter indexWriter = new IndexWriter(indexDir, standardAnalyzer, true);

indexWriter.setMergeFacto..

阅读全文>>

Tags: lucene 例子  

类别: 无分类 |  评论(0) |  浏览(1219) |  收藏
2007年11月09日 14:22:34

几个正则表达式.比较有用.用类分析html页面的.

   private static final String ADD_DATE="追加日.+[\\u000D\\u000A]+.+([0-9]{4}年[0-9]{2}月[0-9]{2}日)";
   private static final String AUTHOR="投稿者:</span>[\\r\\n].+onclick.+>(.+?)<";
   private static final String CATEGORY="カテゴリ.+[\\r\\n]+.+onclick.+>(.+)<";
   private static final String TAG="<meta name=\"keywords\" content=\"(.+)\">";
   private static final String VIEWSCOUNT="再生回数.+[\\r\\n]+.+>([[0-9]+,]*[0-9]+)<";
   private static final String COMMENTS="コメント数.+>([[0-9]+,]*[0-9]+)<";
   private static final String FAVORITED="お気に入り登録.+>([[0-9]+,]*[0-9]+)<";
   private static final String DESCRIBE = "meta name=\"description\" content=\"(.+)\"";
   private static final String TITLE = "<title>(.+)</title>";

阅读全文>>

类别: 无分类 |  评论(0) |  浏览(933) |  收藏
2007年11月07日 20:59:36

自动检测文件中的字符编码

字符检测程序(上) 检测GB2312、BIG5... 选择自 skyyoung 的 Blog
关键字 检测
出处

import java.lang.*;
import java.util.*;
import java.io.*;
import java.net.*;

public class SinoDetect {

static final int GB2312 = 0;
static final int GBK = 1;
static final int HZ = 2;
static final int BIG5 = 3;
static final int EUC_TW = 4;
static final int ISO_2022_CN = 5;
static final int UTF8 = 6;
static final int UNICODE = 7;
static final int ASCII = 8;
static final int OTHER = 9;

static final int TOTAL_ENCODINGS = 10;


// Frequency tables to hold the GB, Big5, and EUC-TW character
// frequencies
int GBFreq[][];
int GBKFreq[][];
int Big5Freq[][];
int EUC_TWFreq[][];
//int UnicodeFreq[94][128];

public static String[] nicename;
public static String[] codings;


public SinoDetect() {
// Initialize the Frequency Table for GB, Big5, EUC-TW
GBFreq = new int[94][94];..

阅读全文>>

类别: 无分类 |  评论(0) |  浏览(2839) |  收藏
2007年11月07日 20:11:12

自动识别文件格式 utf-8 gbk 等读取内容

/**

* FileIO.java 2005-7-27

* All right reserved.

* 文件读写,删除等操作类(也可能包括目录的创建)
*/

package main;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringWriter;
import java.util.Arrays;

/**
* @author 文件IO操作类
*/
public class FileIO {

   /** The size of blocking to use */
   protected static final int BLKSIZ = 2048;

   /**
    * 将指定文件按字符集读为String
    *
    * @throws
    */
   public static String readerToString(String filename, String charset) {
       try {
           return getStringFromFile(filename);
       } catch (Exception e) {
           // TODO Auto-gen..

阅读全文>>

类别: 无分类 |  评论(0) |  浏览(1355) |  收藏