Lucene,这是官方称谓,也有许多人叫它Lucence,做搜索和分词用的工具包.也有人说是Java下的搜索引擎框架库,见仁见智的说法罢了.不管叫什么,确实非常有用,比如做全站的搜索,其实它的用处远大于此,但凡涉及到文本搜索的地方就能用到它.我们就以做全站搜索为例,演示一下如何应用Lucene建立索引.
public void index(List<IArticle> list)
{
//IArticle接口提供getName(标题)和getContent(内容)
//list就是从数据库里查询出来的要建立索引的对象的列表
if(list != null && list.size() > 0)
{
try {
//标记是否重新建立索引,true为重新建立索引
boolean flag = true;
//如果已存在索引,则追加索引
if(IndexReader.indexExists(path))
{
flag = false;
}
ChineseAnalyzer ca = new ChineseAnalyzer();
IndexWriter indexWriter = new IndexWriter("c:/lucene/index",ca,flag);
Document doc = null;
for(int i=0;i<list.size();i++)
{
doc = new Document();
doc.add(new Field("title",article.getName(),Field.Store.YES,Field.Index.TOKENIZED));
//添加内容属性,内容只索引,不存储
doc.add(new Field("content",new StringReader(list.get(i).getContent())));
indexWriter.addDocument(doc);
}
//优化并关闭
indexWriter.optimize();
indexWriter.close();
} catch (Exception e)
{
// TODO 自动生成 catch 块
//e.printStackTrace();
}
}
}
简单说下需要注意的地方:
1.ChineseAnalyzer ca = new ChineseAnalyzer();这个是分析器,Lucene内置多个,处理中文搜索我会用ChineseAnalyzer.
2.IndexWriter indexWriter = new IndexWriter(c:/lucene/index,ca,true);处理索引的类,注意其构造方法里的最后一个参数,如果为true则表示,下次建立索引时会清除这次建立的索引重新建立索引,如果为false则表示追加索引,在原来索引的基础上追加.看实际情况定true或false.
3.doc.add(new Field("title",article.getName(),Field.Store.YES,Field.Index.TOKENIZED));这一句表示为文章标题建立索引并存储.
4.doc.add(new Field("content",new StringReader(list.get(i).getContent())));这句是为内容建立索引但不存储
这样我们就为文章对象建立好索引了,然后就可以利用Lucene的其他类对这个索引目录进行搜索了,关于搜索部分我们稍后再补充上.
下面是搜索部分的代码,写的简陋了点,比较简单,不再多说,请参看注释:
public class Search
{
//定义一个索引搜索类对象
private IndexSearcher searcher = null;
//定义一个Query对象
private Query query = null;
//定义中文分析器
ChineseAnalyzer analyzer = new ChineseAnalyzer();
//构造方法里完成searcher的实例化
public Search()
{
try
{
//这里的参数就是上面我们生成索引的目录
searcher = new IndexSearcher(IndexReader.open("c:/lucene/index"));
}catch(Exception e)
{
e.printStackTrace();
}
}
public Hits search(String keyword) throws Exception
{
//开始搜索的时间
Date start = new Date();
//对我们索引的content字段进行搜索
QueryParser qp = new QueryParser("content",analyzer);
this.query = qp.parse(keyword);
Hits hits = this.searcher.search(query);
Date end = new Date();
System.out.println("检索完成,用时"+(end.getTime()-start.getTime())+"毫秒");
//////////打印测试////////
if(hits != null && hits.length() > 0)
{
for(int i = 0; i < hits.length(); i++)
{
try
{
Document doc = hits.doc(i);
System.out.println("结果"+(i+1)+":"+doc.get("title")+" createTime:"+doc.get("content"));
//System.out.println(doc.get("path"));
}catch(Exception e)
{
e.printStackTrace();
}
}
}
return hits;
}
///调用,主方法
public static void main(String[] args)
{
try
{
Search test = new Search();
Hits h = test.search("你好");
} catch (Exception e)
{
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
分享到:
- 2007-09-20 11:09
- 浏览 4869
- 评论(1)
- 论坛回复 / 浏览 (0 / 12160)
- 查看更多
相关推荐
- **分词器(Tokenizer)**:分词器将输入的文本分解为一系列的词语,这是建立索引的第一步。 - **分析器(Analyzer)**:分析器结合了分词器、过滤器等,负责对文本进行预处理,如去除停用词、词形还原等。 ### 2...
它允许用户直接浏览和分析已经建立的Lucene索引,这对于开发者来说,尤其是在理解和优化索引性能时,具有极大的价值。通过这个工具,我们可以深入了解Lucene索引的工作机制,包括文档的存储方式、分词过程以及倒排...
- **是否重新建立索引**:如果设置为 `true`,则会清空原有索引并重新建立;若为 `false`,则会在现有索引基础上进行增量更新。 ##### 2. Document - **定义**:表示一条索引内容的集合,类似于数据库中的单条...
本文将深入探讨Lucene.NET的多字段查询、建立索引以及组合查询等核心知识点。 一、Lucene.NET基础 1. **建立索引**:Lucene.NET的核心功能之一是创建全文索引,这使得快速检索成为可能。首先,我们需要创建一个`...
现在,我们需要创建一个Lucene索引服务类,负责将数据库中的文章内容建立索引。这个类会使用Lucene提供的API创建索引,并对数据库中的数据进行操作: ```java @Service public class LuceneIndexService { private...
Lucene的核心是建立索引,将原始文本数据转化为结构化的、便于查询的数据结构。这个过程包括文本分析(Tokenization)、词干提取(Stemming)、去停用词(Stopword Removal)等步骤。在这个例子中,我们采用庖丁解牛...
这个过程包括分析文本、创建文档、添加字段、分词、建立词典等步骤。通过索引,可以快速定位到包含特定词项的文档。 接下来是查询阶段。在Lucene中,查询可以是简单的关键词,也可以是复杂的布尔表达式。查询解析器...
- **分词器(Tokenizer)**:将输入文本分解成独立的词语,这是建立索引的第一步。 - **搜索器(Searcher)**:负责执行查询,返回匹配结果。 - **查询解析器(Query Parser)**:将用户的查询字符串转化为Lucene...
1. 建立索引:首先,我们需要创建一个`Directory`对象来存储索引,然后使用`IndexWriter`来添加和更新文档。 2. 搜索操作:利用`IndexSearcher`进行查询,`QueryParser`解析查询字符串,返回`TopDocs`对象,其中...
1. 创建索引:使用Analyzer分析文档内容,通过IndexWriter建立索引。 2. 查询:使用QueryParser解析查询字符串,生成Query对象。 3. 搜索:Searcher执行查询,返回TopDocs对象,包含匹配的文档及其评分。 4. 结果...
通过分词器将原始文档分割为关键词,并建立倒排索引,使得搜索时能快速定位到包含特定关键词的文档。 2. **分词器(Tokenizer)**:分词器是Lucene中处理文本的关键组件,它负责将输入的文本分解为一系列可搜索的...
- **索引**:Lucene通过建立倒排索引来实现快速搜索,索引过程包括分词、分析、建立索引等步骤。 - **分词器(Tokenizer)**:将输入文本分解成可搜索的词语。 - **分析器(Analyzer)**:处理分词结果,如去除...
1. **索引过程**:Lucene 的核心是建立索引,将原始文本数据转化为可供快速搜索的结构。这个过程包括分析(Analyzer)文本、创建文档(Document)、字段(Field)和术语(Term)。分析器负责将输入文本分割成可搜索...
例如,它可能包括创建`IndexWriter`来建立索引,以及`IndexReader`和`IndexSearcher`来读取索引并执行查询的代码。同时,它也可能包含如何解析和添加文档到索引的逻辑。 总结一下,Lucene的短语搜索通过`...
Lucene通过建立倒排索引来实现全文检索,这种方法将文档中的词汇映射到包含该词汇的文档列表,大大提高了搜索效率。 ### Lucene在Java中的应用 在Java开发中,使用Lucene进行全文检索通常涉及以下步骤: 1. **...
搜索则是在建立索引后进行的操作。Lucene支持多种查询类型,如布尔查询、短语查询、范围查询等,用户可以通过编写查询解析器(QueryParser)来构建复杂的查询条件。此外,评分系统(Scoring)是Lucene的另一个关键...
3. **建立索引** - 使用`IndexWriter`将`Document`添加到索引中,`luceneWriter.addDocument(doc)`。 - 索引文件通常存储在本地文件系统上,如本例中的"d:/index/"路径。 4. **搜索操作** - 编写搜索程序,通过...