一、前提条件

1.1确保你安装了Eclipse或者MyEclipse,如果安装的是Eclipse是否安装了JDK.

1.2确保你下载了Tomcat,到这里选择合适的版本下载。

二、下载安装Tomatplugin

我下载的是TomatpluginV 3.2,请到这里下载。

将Tomatpluginv解压缩之后放到Eclipse的plugins目录,MyEclipse是里面的个Eclipse/Plugins目录。

三、设置TomcatPlugin

重启Eclipse和MyEclipse,可以看见3只小猫,如下图,分别代表运行Tomcat、关闭Tomcat、重启Tomcat。

tomcatplugin

3.2在Window—->preference会看到Tomcat属性设置页,选择你的Tomcat版本,选择你的Tomcat存放目录,其中sever.xml就会自动获取,可以不管。确定就ok了。如下图:

Tomcatplugin

在Eclipse中写入中文时就可能就出现这个。

some characters cannot be mapped using “iso-8859” character encoding

或者是

some characters cannot be mapped using gb2312 character encoding

之类的。

意识是文件编码不对,需要改正文件编码。

在Myeclipsce—-windows—-preferences—general—content types—点击text

找到jsp,在最下面修改为utf-8格式即可。其他文件修改方法类似。

eclipse导入JAR包,出现下面的错误:

an internal error occurred during:”Requesting java ASTfrom selection”

An internal error occurred during: “Requesting Java AST from selection”.

jzentry == 0,

jzfile = 109280664,

total = 1215,

name = E:\work\……

原因可能有如下几个

1、别的工程错误配置对其影响,具体参考name里面是那个jar包找到此工程。

2、name里面的jar包损坏,尝试重新换个。

3、

在启动eclipse时是否使用了如

-XX:MaxPermSize=128m -vmargs

-Xms256m

-Xmx512m

一样参数,如使用,请去掉。

如果还不能解决,Hector也不知道了,小菜飘过。

一、概述

Lucene3.0(以下简称3.0)已于2009-11-25发布,3.0版本是重大的版本,改动很大。在API上做了很多的调整,已经删除了很多之前废弃的方法以及类,并支持了很多Java5 的新特性:包括泛型、可变参数、枚举和autoboxing等。

因此,此版本和2.x版本不能兼容,如要使用3.0版本,最好是在新项目中去使用,而不是去升级2.x或之前的版本!

二、2.9版本介绍

由于新版本变动很大,官方是不推荐从旧版本升级到新版本的。因为改动会很大。
其实在2.9版本时改动就很大,因为2.9版本就是为3.0做准备的,但是为了向下兼容,2.9并没有抛弃之前的旧方法,所以可以直接向下兼容。2.9版本主要是在性能方面的优化,包括在Lucene对Lucene底层的内部结构改进、索引的管理方式等多个方面。

1、索引文件改进

Lucene的索引数据是存放在独立的文件中的,这些文件就是存储着索引数据库一些列分离的“片段”。当我们想索引中增加文档时,便会不断的创建一些可以合并的新片段,因为读写文件的开销比较大,因此这些字段信息Lucene并非每次都直接加到索引文件里面去,而是先缓存,等到一定量的时候再一次写到文件中。在2.9以后,Lucene会为每个片段分别管理FieldCache以此避开跨片段加载FieldCatch的需求,这样就解决了Lucene跨片段加载FieldCatch的效率很低下问题,这个改动大为提高了性能。Lucid Imagination的Mark Miller运行了一个简单的性能测试,表明在5,000,000个不同字符串下的情况下,Lucene 相对于2.4版本会获得15倍左右的性能提高: Lucene 2.4: 150.726s Lucene 2.9: 9.695s

2、重开搜索

新版本引入了IndexWriter.getReader()方法,它可用于搜索目前完整的索引,包括当前IndexWriter会话中还没有提交的改变,这带来了接近于实时搜索的能力。此外,你还可以调用IndexWriter.setMergedSegmentWarmer()方法进行“预热”,这样那些片断便可以立即投入使用了。

3、数字处理

2.9版本之前的版本,都是基于文本搜索的,因为对于很多数字的处理方式就很头疼,例如在我们项目中遇到的很多问题都是由于把数字当作了文本处理出现的BUG:1、搜索价格的5,把包含.5的也搜索出来了;2、排序(降序)时,把800排到5000前面;……这些都是由于Lucene把所有的都作为文本处理的方式造成的问题。Lucene 2.9以后已经自带对数字的处理方式。Field和Query类会采取合适的精度进行索引和搜索,这样大大降低了需要搜索的关键字数量,使查询的响应能力得以显著提高。

4、其他优化

引入了新的查询类型和适用性更广的多关键字查询(通配、前缀等等)方式,以及新的针对波斯语,阿拉伯语及中文的分析器。此外,这次更新还包括更好Unicode支持,一个新的查询分析框架,以及对地理位置的查询,它允许根据距离信息对文档进行过滤和排序(如“找出我家5公里范围内的所有超市”)。

三、2.9版本和3.0比较

虽然2.9是为3.0做准备的一个版本,但是3.0和2.9相比较,变化还是比较大的,这处要体现在:

  1. 1、3.0抛弃了在2.9声明废弃的方法,因此3.0无法向下兼容;
  2. 2、3.0放弃了对Java1.4的支持,改为对高版本Java1.5和ant 1.7.0支持;
  3. 3、其他内核的一些变化,如oalLock.isLocked()现在会抛出IOException异常,对于一些静态变量的改变等。

四、3.0主要方法的改变

这里这种讲下目前新版本后使用建立索引以及搜索的不同。

1、建立索引

新版本在建立索引时抛弃了很多未用的方法,见下图,所有声明被抛弃的IndexWriter构造函数都在3.0中被删除。

3.0版本的IndexWriter构造函数:

在增加索引时,每个field的常量也有改变,具体如下:

2、查询

删除了Hits类,增加了TopScoreDocCollector去取得“Hits”,实际上在3.0给了个新命名:collector。使用方式和hits类同,同时删除了Search以及QueryParser的几个构造方法,QueryParser删除了 QueryParser(String f, Analyzer a)构造方法。
新查询例子如下(蓝色部分是与以往不同的部分):[CODE=java]
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field,
new StandardAnalyzer(Version.LUCENE_CURRENT));
Query query = parser.parse(q);
TopScoreDocCollector collector = TopScoreDocCollector.create(100, true);
IndexSearcher is = new IndexSearcher(FSDirectory.open(file), true);
is.search(query, collector);
ScoreDoc[] docs = collector.topDocs().scoreDocs;
for (int i = 0; i < docs.length; i++) {
Document doc = is.doc(docs[i].doc);// new method is.doc()
System.out.println(doc.getField(“name”) + ” ” + docs[i].toString() + ” “);
}

[/CODE]

3.0版本的Search构造方法:

3.0前的构造方法:

五、3.0总体图

3.0版本的结构和之前的版本(2.9之前)相比,在程序结构上表现出来就只是多了一个message包,用来专门处理国际化。

可以看到,3.0和之前的版本一样还是由对外接口、索引核心以及基础结构封装三大部分共八个模块(也即包package),详细介绍详见附件一。 我们从上图也可以看到Lucene搜索时的调用关系:当我们要查询一个词时,在查询模块(search)会先调用语法分析器(queryParser)对查询语句进行分析,语法分析模块调用了词法分析器(analysis)进行词法分析,如对搜索关键字分词、过滤等,词法分析器在使用时会根据实际情况调用国际化模块(message)进行一些国际化的处理。当这些前置工作做完之后,才真正进入到搜索核心,首先会调用索引模块(index),它负责向底层的存储类(store)去读取索引文件里面的数据,然后返回给查询模块。其他模块在整个搜索过程中是作为公共类存在的。

一、基本配置原则:

  • 1、需要引入Heritrix的系列jar包。
  • 2、需要引入相应的执行源文件。
  • 3、需要配置Heritrix的执行参数。

二、配置方法

  • 1.新建一个工程后,将工程目录下的src包删掉。将源代码包(即heritrix-1.14.3-src.zip,可到官网去下载)中的src和lib文件夹复制到工程目录中,则此时工程目录下有bin、src、lib三个文件夹还有.classpath和.project两种工程配置文件(工程建立时生成的)。
  • 2.将 项目名称/src/conf 文件夹中modules、profiles、selftest三个文件夹以及heritrix.properties、jndi.properties剪切到上一层文件夹,即 项目名称/src 中,将原来的conf文件夹删除掉。
  • 3.将 项目名称/src/java 文件夹中的com、org、st、meta-INF四个文件夹剪切到上一层文件夹中,即 项目名称/src 中,将原来的java文件夹删除掉。
  • 4.通过Build Path将 项目名称/lib 中的jar包引用到工程项目中。
  • 5.找到heritrix.properties,然后在heritrix.cmdline.admin = admin:admin中随便设置个密码,设置方式是 用户名:密码;将heritrix.version改成1.14.3
  • 6.在MyEclipse中,刷新你的工程,在src\org.archive.crawler中找到Heritrix.java类,点右键找到启动配置(Run As–>Open Run Dialog),在VM arguments添加-Dheritrix.development,在Program arguments添加–admin=admin:admin,然后选择Heritrix类启动程序。
  • 7.运行Heritrix类,如果没有错误提示,在浏览器中输入http://127.0.0.1:8080,出现用户名登陆界面则表示成功了。

三、相关说明

  • 1.如果你用的MyEclipse版本不同,可能Eclipse自带的JDK版本太低或者太高,在浏览器输入地址后会出现HTTP ERROR: 500 Bad+version+number+in+%2Eclass+file的提示。此时需要修改MyEclipse的jdk版本。
  • 2、如果有 Failed to start: SocketListener@127.0.0.1:8080这样的提示说明你的端口8080被占用,你可以到heritrix.properties中修改端口。
  • 3、如果有not find webapps floder错误提示,说明是配置路径有问题,或者没有将新建工程里面最初的一个src文件夹没有删掉。
  • 4、VM arguments参数(-Dheritrix.development)是用来区别开发模式和非开发模式的。
  • 5、如果有弹出来的Can not find the main class. Program will exit.说明是JDK版本和EClipse版本不兼容或者没有正确引入jdk。

 给数据库字段建立索引的方法和给文件建立索引的方法类似。(可见这篇文章:) [Lucene3.0学习笔记1(建立索引)]

只是需要将待索引的源换为从数据库里面读取的字段值就可以了。

代码中用到的数据库操作类在这里:[java通用数据库操作类]

请对照 [Lucene3.0学习笔记1(建立索引)]加以理解。

代码如下:

[CODE=java]
package com.hector.firstlucene;

import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

/**********************
*
* @author Hector
* 建立数据库索引 lucene3.0+
*/

public class DataBaseIndexer{
public static void main(String[] args) throws IOException,SQLException{
String indexDir = “d:\\lucene\\index”;
DBConn conn = new DBConn();
conn.OpenConnection();
ResultSet rs = conn.ExecuteQuery(“select * from Article”);
// 为表字段建立索引
Directory dir = new SimpleFSDirectory(new File(indexDir));
IndexWriter indexWriter = new IndexWriter(dir,
new StandardAnalyzer(Version.LUCENE_30), true,
IndexWriter.MaxFieldLength.UNLIMITED);
while (rs.next()) {
System.out.println(rs.getString(“Article_Title”));
Document doc = new Document();
doc.add(new Field(“Article_Title”, rs.getString(“Article_Title”),Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field(“Article_Content”, rs.getString(“Article_Content”),Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field(“indexDate”,DateTools.dateToString(new Date(), DateTools.Resolution.DAY),Field.Store.YES,Field.Index.NOT_ANALYZED));
indexWriter.addDocument(doc);
}
System.out.println(“numDocs”+indexWriter.numDocs());
indexWriter.close();
}
}
[/CODE]

d:\lucene\index是上一篇学习笔记([Lucene3.0学习笔记1(建立索引)] )中生成的索引文件的存放地址。具体步骤简介如下:

1、创建Directory对象,索引文件夹

2、创建IndexSearch对象,建立查询(参数是Directory对象)

3、创建QueryParser对象(lucene版本,查询Field字段,所用分词器)

4、生成Query对象,由QueryParser对象的parse函数生成(参数是所查的关键字)

5、建立TopDocs对象(IndexSearch的search函数,参数是Query查询对象,)

6、TopDocs对象数组里存放查询信息

7、关闭IndexSearch

 

源码:

[CODE=java]
package com.hector.firstlucene;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;
/**
* 搜索索引 Lucene 3.0+
* @author Hector
*
*/
public class Searcher {

public static void main(String[] args) throws IOException, ParseException {
//保存索引文件的地方
String indexDir = “d:\\lucene\\index”;
Directory dir = new SimpleFSDirectory(new File(indexDir));
//创建 IndexSearcher对象,相比IndexWriter对象,这个参数就要提供一个索引的目录就行了
IndexSearcher indexSearch = new IndexSearcher(dir);
//创建QueryParser对象,第一个参数表示Lucene的版本,第二个表示搜索Field的字段,第三个表示搜索使用分词器
QueryParser queryParser = new QueryParser(Version.LUCENE_30,
“contents”, new StandardAnalyzer(Version.LUCENE_30));
//生成Query对象
Query query = queryParser.parse(“好”);
//搜索结果 TopDocs里面有scoreDocs[]数组,里面保存着索引值
TopDocs hits = indexSearch.search(query, 10);
//hits.totalHits表示一共搜到多少个
System.out.println(“找到了”+hits.totalHits+”个”);
//循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值
for (int i = 0; i < hits.scoreDocs.length; i++) {
ScoreDoc sdoc = hits.scoreDocs[i];
Document doc = indexSearch.doc(sdoc.doc);
System.out.println(doc.get(“filename”));
}
indexSearch.close();
}
}

[/CODE]

代码中Lucene相关名词:[Lucene相关名词解释]

1、analysis

Analysis包含一些内建的分析器,例如按空白字符分词的WhitespaceAnalyzer,添加了stopwrod过滤的StopAnalyzer,最常用的是StandardAnalyzer。

2、document

Document包含文档的数据结构,例如Document类定义了存储文档的数据结构,Field类定义了Document的一个域。

3、index

Index包含了索引的读写类,例如对索引文件的segment进行写、合并、优化的IndexWriter类和对索引进行读取和删除操作的 IndexReader类,这里要注意的是不要被IndexReader这个名字误导,以为它是索引文件的读取类,实际上删除索引也是由它完成, IndexWriter只关心如何将索引写入一个个segment,并将它们合并优化;IndexReader则关注索引文件中各个文档的组织形式。

4、queryParser

QueryParser包含了解析查询语句的类,lucene的查询语句和sql语句有点类似,有各种保留字,按照一定的语法可以组成各种查询。 Lucene有很多种Query类,它们都继承自Query,执行各种特殊的查询,QueryParser的作用就是解析查询语句,按顺序调用各种 Query类查找出结果。

5、search

Search包含了从索引中搜索结果的各种类,例如刚才说的各种Query类,包括TermQuery、BooleanQuery等就在这个包里。

6、store

Store包含了索引的存储类,例如Directory定义了索引文件的存储结构,FSDirectory为存储在文件中的索引,RAMDirectory为存储在内存中的索引,MmapDirectory为使用内存映射的索引。

7、util

Util包含一些公共工具类,例如时间和字符串之间的转换工具。

8、message

处理国际化的类。