- 浏览: 258866 次
- 性别:
- 来自: 未定
文章分类
最新评论
-
zl544434558:
最后一行</filter> 多余的
Springmvc 乱码问题 -
imknown:
方法有效,感谢博主!
Springmvc 乱码问题 -
notafreak:
方法有效,感谢博主
Springmvc 乱码问题 -
linvar:
ligangdufs 写道 what about resin ...
Springmvc 乱码问题 -
ligangdufs:
what about resin
Springmvc 乱码问题
[size=medium]本文的目的不在于对Lucene的概念和设计这些进行介绍,仅在于介绍怎么样去使用Lucene来达到自己想要的几种常见的全文检索的需求,如果想深入了解Lucene的话本文不会带给你什么收获的。看完本文后想更深入的了解Lucene请访问:http://lucene.apache.org
一. 概述
随着系统信息的越来越多,怎么样从这些信息海洋中捞起自己想要的那一根针就变得非常重要了,全文检索是通常用于解决此类问题的方案,而Lucene则为实现全文检索的工具,任何应用都可通过嵌入它来实现全文检索。
二. 环境搭建
从lucene.apache.org上下载最新版本的lucene.jar,将此jar作为项目的build path,那么在项目中就可以直接使用lucene了。
三. 使用说明
3.1. 基本概念
这里介绍的主要为在使用中经常碰到一些概念,以大家都比较熟悉的数据库来进行类比的讲解,使用Lucene进行全文检索的过程有点类似数据库的这个过程,table---à查询相应的字段或查询条件----à返回相应的记录,首先是IndexWriter,通过它建立相应的索引表,相当于数据库中的table,在构建此索引表时需指定的为该索引表采用何种方式进行构建,也就是说对于其中的记录的字段以什么方式来进行格式的划分,这个在Lucene中称为Analyzer,Lucene提供了几种环境下使用的Analyzer:SimpleAnalyzer、StandardAnalyzer、GermanAnalyzer等,其中StandardAnalyzer是经常使用的,因为它提供了对于中文的支持,在表建好后我们就需要往里面插入用于索引的记录,在Lucene中这个称为Document,有点类似数据库中table的一行记录,记录中的字段的添加方法,在Lucene中称为Field,这个和数据库中基本一样,对于Field Lucene分为可被索引的,可切分的,不可被切分的,不可被索引的几种组合类型,通过这几个元素基本上就可以建立起索引了。在查询时经常碰到的为另外几个概念,首先是Query,Lucene提供了几种经常可以用到的Query:TermQuery、MultiTermQuery、BooleanQuery、WildcardQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、FuzzyQuery、RangeQuery、SpanQuery,Query其实也就是指对于需要查询的字段采用什么样的方式进行查询,如模糊查询、语义查询、短语查询、范围查询、组合查询等,还有就是QueryParser,QueryParser可用于创建不同的Query,还有一个MultiFieldQueryParser支持对于多个字段进行同一关键字的查询,IndexSearcher概念指的为需要对何目录下的索引文件进行何种方式的分析的查询,有点象对数据库的哪种索引表进行查询并按一定方式进行记录中字段的分解查询的概念,通过IndexSearcher以及Query即可查询出需要的结果,Lucene返回的为Hits.通过遍历Hits可获取返回的结果的Document,通过Document则可获取Field中的相关信息了。
通过对于上面在建立索引和全文检索的基本概念的介绍希望能让你对Lucene建立一定的了解。
3.2. 全文检索需求的实现
索引建立部分的代码:
private void createIndex(String indexFilePath) throws Exception{
IndexWriter iwriter=getWriter(indexFilePath);
Document doc=new Document();
doc.add(Field.Keyword("name","jerry"));
doc.add(Field.Text("sender","bluedavy@gmail.com"));
doc.add(Field.Text("receiver","google@gmail.com"));
doc.add(Field.Text("title","用于索引的标题"));
doc.add(Field.UnIndexed("content","不建立索引的内容"));
Document doc2=new Document();
doc2.add(Field.Keyword("name","jerry.lin"));
doc2.add(Field.Text("sender","bluedavy@hotmail.com"));
doc2.add(Field.Text("receiver","msn@hotmail.com"));
doc2.add(Field.Text("title","用于索引的第二个标题"));
doc2.add(Field.Text("content","建立索引的内容"));
iwriter.addDocument(doc);
iwriter.addDocument(doc2);
iwriter.optimize();
iwriter.close();
}
private IndexWriter getWriter(String indexFilePath) throws Exception{
boolean append=true;
File file=new File(indexFilePath+File.separator+"segments");
if(file.exists())
append=false;
return new IndexWriter(indexFilePath,analyzer,append);
}
3.2.1. 对于某字段的关键字的模糊查询
Query query=new WildcardQuery(new Term("sender","*davy*"));
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
3.2.2. 对于某字段的关键字的语义查询
Query query=QueryParser.parse("索引","title",analyzer);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
3.2.3. 对于多字段的关键字的查询
Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
3.2.4. 复合查询(多种查询条件的综合查询)
Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);
Query mquery=new WildcardQuery(new Term("sender","bluedavy*"));
TermQuery tquery=new TermQuery(new Term("name","jerry"));
BooleanQuery bquery=new BooleanQuery();
bquery.add(query,true,false);
bquery.add(mquery,true,false);
bquery.add(tquery,true,false);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(bquery);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
四. 总结
相信大家通过上面的说明能知道Lucene的一个基本的使用方法,在全文检索时建议大家先采用语义时的搜索,先搜索出有意义的内容,之后再进行模糊之类的搜索,^_^,这个还是需要根据搜索的需求才能定了,Lucene还提供了很多其他更好用的方法,这个就等待大家在使用的过程中自己去进一步的摸索了,比如对于Lucene本身提供的Query的更熟练的掌握,对于Filter、Sorter的使用,自己扩展实现Analyzer,自己实现Query等等,甚至可以去了解一些关于搜索引擎的技术(切词、索引排序 etc)等等。
[/size][size=large][/size]
一. 概述
随着系统信息的越来越多,怎么样从这些信息海洋中捞起自己想要的那一根针就变得非常重要了,全文检索是通常用于解决此类问题的方案,而Lucene则为实现全文检索的工具,任何应用都可通过嵌入它来实现全文检索。
二. 环境搭建
从lucene.apache.org上下载最新版本的lucene.jar,将此jar作为项目的build path,那么在项目中就可以直接使用lucene了。
三. 使用说明
3.1. 基本概念
这里介绍的主要为在使用中经常碰到一些概念,以大家都比较熟悉的数据库来进行类比的讲解,使用Lucene进行全文检索的过程有点类似数据库的这个过程,table---à查询相应的字段或查询条件----à返回相应的记录,首先是IndexWriter,通过它建立相应的索引表,相当于数据库中的table,在构建此索引表时需指定的为该索引表采用何种方式进行构建,也就是说对于其中的记录的字段以什么方式来进行格式的划分,这个在Lucene中称为Analyzer,Lucene提供了几种环境下使用的Analyzer:SimpleAnalyzer、StandardAnalyzer、GermanAnalyzer等,其中StandardAnalyzer是经常使用的,因为它提供了对于中文的支持,在表建好后我们就需要往里面插入用于索引的记录,在Lucene中这个称为Document,有点类似数据库中table的一行记录,记录中的字段的添加方法,在Lucene中称为Field,这个和数据库中基本一样,对于Field Lucene分为可被索引的,可切分的,不可被切分的,不可被索引的几种组合类型,通过这几个元素基本上就可以建立起索引了。在查询时经常碰到的为另外几个概念,首先是Query,Lucene提供了几种经常可以用到的Query:TermQuery、MultiTermQuery、BooleanQuery、WildcardQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、FuzzyQuery、RangeQuery、SpanQuery,Query其实也就是指对于需要查询的字段采用什么样的方式进行查询,如模糊查询、语义查询、短语查询、范围查询、组合查询等,还有就是QueryParser,QueryParser可用于创建不同的Query,还有一个MultiFieldQueryParser支持对于多个字段进行同一关键字的查询,IndexSearcher概念指的为需要对何目录下的索引文件进行何种方式的分析的查询,有点象对数据库的哪种索引表进行查询并按一定方式进行记录中字段的分解查询的概念,通过IndexSearcher以及Query即可查询出需要的结果,Lucene返回的为Hits.通过遍历Hits可获取返回的结果的Document,通过Document则可获取Field中的相关信息了。
通过对于上面在建立索引和全文检索的基本概念的介绍希望能让你对Lucene建立一定的了解。
3.2. 全文检索需求的实现
索引建立部分的代码:
private void createIndex(String indexFilePath) throws Exception{
IndexWriter iwriter=getWriter(indexFilePath);
Document doc=new Document();
doc.add(Field.Keyword("name","jerry"));
doc.add(Field.Text("sender","bluedavy@gmail.com"));
doc.add(Field.Text("receiver","google@gmail.com"));
doc.add(Field.Text("title","用于索引的标题"));
doc.add(Field.UnIndexed("content","不建立索引的内容"));
Document doc2=new Document();
doc2.add(Field.Keyword("name","jerry.lin"));
doc2.add(Field.Text("sender","bluedavy@hotmail.com"));
doc2.add(Field.Text("receiver","msn@hotmail.com"));
doc2.add(Field.Text("title","用于索引的第二个标题"));
doc2.add(Field.Text("content","建立索引的内容"));
iwriter.addDocument(doc);
iwriter.addDocument(doc2);
iwriter.optimize();
iwriter.close();
}
private IndexWriter getWriter(String indexFilePath) throws Exception{
boolean append=true;
File file=new File(indexFilePath+File.separator+"segments");
if(file.exists())
append=false;
return new IndexWriter(indexFilePath,analyzer,append);
}
3.2.1. 对于某字段的关键字的模糊查询
Query query=new WildcardQuery(new Term("sender","*davy*"));
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
3.2.2. 对于某字段的关键字的语义查询
Query query=QueryParser.parse("索引","title",analyzer);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
3.2.3. 对于多字段的关键字的查询
Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
3.2.4. 复合查询(多种查询条件的综合查询)
Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);
Query mquery=new WildcardQuery(new Term("sender","bluedavy*"));
TermQuery tquery=new TermQuery(new Term("name","jerry"));
BooleanQuery bquery=new BooleanQuery();
bquery.add(query,true,false);
bquery.add(mquery,true,false);
bquery.add(tquery,true,false);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(bquery);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
四. 总结
相信大家通过上面的说明能知道Lucene的一个基本的使用方法,在全文检索时建议大家先采用语义时的搜索,先搜索出有意义的内容,之后再进行模糊之类的搜索,^_^,这个还是需要根据搜索的需求才能定了,Lucene还提供了很多其他更好用的方法,这个就等待大家在使用的过程中自己去进一步的摸索了,比如对于Lucene本身提供的Query的更熟练的掌握,对于Filter、Sorter的使用,自己扩展实现Analyzer,自己实现Query等等,甚至可以去了解一些关于搜索引擎的技术(切词、索引排序 etc)等等。
[/size][size=large][/size]
发表评论
-
Springmvc 乱码问题
2012-08-24 22:54 12105后端的Tomcat server.xml里配置的<Con ... -
logback note
2012-04-01 16:35 01.logback核心 a.Logger(记录者), b.A ... -
java Cookie
2011-11-01 21:33 1377cookie的组成部分: key, value, maxage ... -
java 正则表达式
2011-10-30 14:53 2140正则表达式的关键是 创建用于"在源字符串中匹配出某些 ... -
java email
2011-10-27 17:04 0http://coolshell.cn/articles/42 ... -
java 定时器
2011-10-27 11:26 01.java.util.Timer 1.1 对应单个后台线程 ... -
Resin note1
2011-06-27 23:11 1656<cluster-default> ... -
Maven note2
2011-04-25 14:16 01.The Build Lifecycle A build ... -
Maven note1
2011-04-24 18:07 01.What is Maven Although there ... -
freemarker使用总结
2010-06-20 16:51 35041.freemarker在使用spring MVC时会出现乱 ... -
springmvc 笔记
2010-05-22 10:27 6830struct2很不好用,springmvc比较给力,跟spr ... -
ibatis3 的返回值
2010-05-11 16:43 1179当执行sqlSession.selectOne("& ... -
java static util, helper
2010-04-18 19:50 1573我们经常会写一些util,helper类, 而一般这些类的方 ... -
Quartz 使用笔记
2010-04-16 21:35 14181.Quartz的主要构件: SchedulerFactory ... -
pinyin4j 笔记
2010-04-05 21:00 1804最近需要将城市名称转换为拼音去访问google weather ... -
ibatis3 的变量
2010-04-05 10:12 1754ibatis的变量其实没什么特别,就是使用#{}定义, 比如 ... -
VPS中的resin3.1和tomcat6
2010-03-28 11:00 1762兴冲冲地在VPS安装了jdk1.6, resin-pro-3. ... -
java URL encoding and decoding
2010-03-19 09:48 8673HTML编码规则是: 字符"a"-&quo ... -
Cookie小解
2010-03-18 19:27 1250Cookie是客户端与服务器 ... -
ibatis3的使用参考
2010-03-12 17:03 3947以前用过ibatis2,但是听说ibatis3有较大的性能提升 ...
相关推荐
通过学习 Lucene,开发者不仅可以掌握全文检索的基本原理,还能了解如何设计高效的索引结构,以及如何根据特定需求定制搜索功能。例如,你可以自定义查询分析器、实现删除操作、扩展排序机制,以及利用 Lucene 的 ...
Apache Lucene是一个非常流行的开源全文检索库,由Apache软件基金会提供。它为开发者提供了构建...由于其开源性质,开发者可以自由地使用、修改和分发Lucene的代码,这也使得它在开源社区中得到了广泛的使用和支持。
它不是一个可以直接使用的应用程序,而是一个为开发者提供构建全文搜索功能的底层库,核心库为 lucene-core-2.2.0.jar。Lucene 提供了丰富的 API 和工具,帮助开发人员在各种应用中实现高效的全文检索功能。 **...
本文将深入浅出地介绍Lucene的基本使用,帮助初学者快速上手。 一、Lucene的架构与工作原理 Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。首先,每个文档由一个或多个...
doc.add(new Field("title", "Lucene 3.0使用介绍", Field.Store.YES, Field.Index.ANALYZED)); doc.add(new Field("content", "这是一个关于Lucene 3.0的实例教程。", Field.Store.YES, Field.Index.ANALYZED)); ...
### Lucene基本使用详解 #### 一、概述 在当今数据爆炸的时代,如何从海量的信息中快速找到所需的内容成为了一项重要技能。全文检索技术便应运而生,旨在提高信息检索的效率与准确度。Lucene是一款由Apache基金会...
**Lucene 常用功能介绍** Lucene 是一个高性能、全文检索库,由Apache软件基金会开发并维护。...结合课程文档和视频讲解,可以更深入地理解Lucene的工作原理和使用技巧,从而更好地利用它来解决实际的搜索问题。
SpringBoot与Lucene集成案例详解 本文将详细介绍如何将SpringBoot与Lucene集成,以实现站内搜索系统。 Lucene是一个高性能的全文检索...通过本文,我们可以了解Lucene的基本概念和使用方法,并将其应用于实际项目中。
本文将详细介绍Lucene.Net的基本用法,包括环境搭建、基本应用流程(索引创建与文档搜索)、多字段搜索以及一些高级特性。 #### 二、环境搭建 在使用Lucene.Net之前,需确保已安装.NET Framework或.NET Core环境,...
- Lucene 本身是一个开源的全文搜索框架,它不直接作为一款应用产品使用,而是作为一个工具集,用于开发人员构建自定义的搜索解决方案。它不包含像百度或 Google Desktop 这样的现成搜索界面,而是提供底层的索引和...
通过本文,我们深入了解了Lucene的关键组件和它们的作用,包括Analyzer、Document、Field、Term、Segment等,同时还介绍了Lucene的整体架构和组成部分。此外,还提供了一个简单的示例代码,帮助读者理解如何使用...
Lucene是Apache软件基金会的一个开放源代码项目,它是一个全文搜索引擎库,提供了文本分析、索引和搜索的基本功能。Lucene最初由Doug Cutting开发,现在已经成为Java领域中最广泛使用的全文检索库。它不仅适用于Java...
Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段(Field)。 - **字段(Field)**:字段是文档的组成部分,每个字段都有特定的类型(如文本、日期等)...
在这个主题中,我们将深入探讨 Lucene 的基本使用方法,包括如何集成 IK 分词器以及实现高亮显示。 ### 1. Lucene 的核心概念 - **索引(Index)**: Lucene 首先需要对文档进行索引,将文本数据转换为可搜索的结构...
了解这些文件格式后,我们还要知道Lucene索引中使用的基本数据类型,如Byte、UInt32、UInt64和VInt。VInt是一种变长整数类型,它根据数值大小动态占用字节,有效地节省了存储空间。 总的来说,Lucene的索引文件格式...
#### 四、Lucene基本使用示例 下面是一个简单的Lucene使用示例,演示如何创建索引和添加文档: ```java // 创建索引写入器 IndexWriter writer = new IndexWriter("/data/index/", new StandardAnalyzer(), true);...
博文链接中提到的是一个关于Lucene3的博客文章,可能详细介绍了如何在实际项目中使用Lucene进行全文检索。博主"chinaxxren"在ITEYE上分享了这篇博客,虽然具体内容未在描述中给出,但我们可以推测博主可能讲解了以下...
《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。源码的提供使得读者可以更直观地理解Lucene的工作原理,这对于学习和开发基于Lucene的搜索应用非常有帮助。...
#### 三、Lucene的基本操作 ##### 3.1 创建索引 ```java // 初始化写入索引对象 private IndexWriter writer; private Directory dit; // 打开指定目录作为索引存储位置 dit = FSDirectory.open(Paths.get("存放...
《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...