说明一下,这一篇文章的用到的lucene,是用2.4版本的,主要在查询的时候2.0版本的lucene与以前的版本有了一些区别
下面是一个简单的例子
1.第一步建立索引
public class IndexDatebase {
public static void main(String[] args) throws IOException {
//创建保存索引的目录
String indexDir = "d://indexDir";
//创建Directory对象,具体的实现有FSDirectory,RAMDirectory,MMapDirectory,NIOFSDirector
//FSDirectory表示索引是放到文件里面的,RAMDirectory是放到内存里面
//new RAMDirectory()
Directory index = FSDirectory.getDirectory(new File(indexDir));
//创建索引IndexWriter对象,要四个参数,第一个是Directory对象,可以传File和String类型的path
//new StandardAnalyzer()这个表示分析器,拆字用的,其它的分析器还有new ChineseAnalyzer(),new IK_CAnalyzer(),new CJKAnalyzer()
//第三个参数代表是新建Index还是在原来上面的追加,true是新建
//表示分词的最大值,比如说new MaxFieldLength(2),就表示两个字一分,一般用IndexWriter.MaxFieldLength.LIMITED
IndexWriter writer = new IndexWriter(indexDir,new StandardAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED);
//IndexWriter writer = new IndexWriter(indexDir,new StandardAnalyzer(),true,new MaxFieldLength(20));
addDoc(writer,"法医鉴定称湖北石南海首死亡厨师系自杀");
addDoc(writer,"国务院建议珠海横琴岛划南海地交澳门管理");
addDoc(writer,"印尼在南海扣75名中国渔民 中方要求尽快释放南海南海南海南海南海南海南海");
addDoc(writer,"南海南海南海南海南海南海南海南海南海印尼在南海扣75南海南海名中国渔民 中方要求尽快释放");
addDoc(writer,"湖北洪湖一初南海中生被同学刺亡 亲属怒砸学校 ");
//优化
writer.optimize();
//关闭流
writer.close();
}
/**
* 把Document对象加到Index里面
* @param w
* @param value
* @throws IOException
*/
private static void addDoc(IndexWriter w, String value) throws IOException {
//新建的Document对象
Document doc = new Document();
//Field(String name, String value, Store store, Index index)表示保存,并建立索引,如果字段多的话,不要都建立索引
doc.add(new Field("title", value, Field.Store.YES,Field.Index.ANALYZED));
//加进去
w.addDocument(doc);
}
}
2.从索引中找出相应的对象
public class QueryLucene {
public static void main(String[] args) throws ParseException, CorruptIndexException, IOException {
//创建Query,QueryParser对象,根据Field建立的索引的KEY来搜,并设置要搜的内容
Query query = new QueryParser("title",new StandardAnalyzer()).parse("南海");
//可以理解成读Index对象,Directory,File,String都行
IndexSearcher indexSearch = new IndexSearcher(FSDirectory.getDirectory(new File("d://indexDir")));
//表示查出前四个
TopDocCollector collector = new TopDocCollector(4);
//查找
indexSearch.search(query,collector);
//ScoreDoc这个对象还不清楚,但是有多少结果,就有多少个这个对象
ScoreDoc[] hits = collector.topDocs().scoreDocs;
for(int i=0;i<hits.length;++i) {
//找到这个Document原来的索引值
int docId = hits[i].doc;
System.out.println(docId);
//根据这个值找到对象的Document
Document d = indexSearch.doc(docId);
System.out.println((i + 1) + ". " + d.get("title"));
}
}
}
1.x,2.0和2.4是有一些区别的
比如说:
1
//1.x
IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true);
//2.0,2.4
IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);
2.
Field.Index.TOKENIZED 替换为 Field.Index.ANALYZED
没啥特殊的,改了一个名字而已
3.
IndexWriter.flush();
替换为
IndexWriter.commit();
4.org.apache.lucene.search.Hits;
这个类将在3.0中被删除
新的使用方法在上面的例子中
5.Field的创建
在2.0+中
Field没了Keyword、UnIndexed、UnStored、Text这几个静态成员,只能用
Field(String, String, Store, Index)。
Keyword对应Field.Store.YES, Field.Index.UN_TOKENIZED,
UnIndexed 对应Field.Store.YES, Field.Index.NO,
UnStored对应Field.Store.NO, Field.Index.TOKENIZED,
Text对应Field.Store.YES, Field.Index.TOKENIZED
//2.0版本以上
Field(String name, byte[] value, Field.Store store)
// Create a stored field with binary value.
Field(String name, Reader reader)
// Create a tokenized and indexed field that is not stored.
Field(String name, Reader reader, Field.TermVector termVector)
// Create a tokenized and indexed field that is not stored, optionally with storing term vectors.
Field(String name, String value, Field.Store store, Field.Index index)
// Create a field by specifying its name, value and how it will be saved in the index.
Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector)
// Create a field by specifying its name, value and how it will be saved in the index.
Field.Store 表示“是否存储”,即该Field内的信息是否要被原封不动的保存在索引中。
Field.Index 表示“是否索引”,即在这个Field中的数据是否在将来检索时需要被用户检索到,一个“不索引”的Field通常仅是提供辅助信息储存的功能。
Field.TermVector 表示“是否切词”,即在这个Field中的数据是否需要被切词。
通常,参数用Reader,表示在文本流数据源中获取数据,数据量一般会比较大。像链接地址URL、文件系统路径信息、时间日期、人名、居民身份证、电话号码等等通常将被索引并且完整的存储在索引中,但一般不需要切分词,通常用上面的第四个构造函数,第三四个参数分别为Field.Store.YES, Field.Index.YES。而长文本通常可用第3个构造函数。
分享到:
相关推荐
**Lucene笔记** Lucene是Apache软件基金会的一个开放源代码项目,它是一个全文搜索引擎库,提供了文本检索和分析的核心工具。作为一个高性能、可扩展的信息检索库,Lucene被广泛应用于各种搜索应用,如网站搜索、...
**Lucene学习笔记** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了强大的文本分析、索引和搜索功能,适用于构建复杂的全文检索系统。本笔记将...
10. **lucene学习笔记 3 .txt** 这是作者的学习笔记,可能包含了个人理解和使用Lucene过程中遇到的问题及解决方案,提供了不同角度的见解和实践经验。 通过这些文档,你可以系统地学习和掌握Lucene的各个方面,从...
这个“lucene 小资源”可能包含了作者在学习和使用Lucene过程中积累的一些资料和经验,对于初学者或者想要深入理解Lucene的人来说,是非常宝贵的资源。 Lucene的核心功能包括文档索引、搜索以及相关的文本处理。它...
**Apache Solr 架设搜索服务器 学习笔记** Apache Solr 是一款强大的开源全文搜索引擎,基于 Lucene 库,提供了高效、可扩展的搜索和分析功能。它被广泛应用于各种规模的企业,用于构建高性能的搜索应用。这篇学习...
solr 学习笔记主要涵盖了 Solr 的基本安装与配置,以及 Solr 服务器复制的配置,这些都是初学者需要掌握的基础知识。 Solr 是一款基于 Lucene 的全文搜索引擎,广泛应用于大数据检索和文本分析。在安装 Solr 时,...
【Solr学习心得与总结笔记】 一、站内搜索的技术选型 站内搜索的实现方式多样,但针对不同需求,技术选型有所不同: 1. 使用Lucene:Lucene是Java开发的全文检索库,提供了底层的搜索算法,但直接使用Lucene需要...
`compass学习笔记.doc`是一份关于Compass的学习文档,可能包含了使用Compass的基本步骤,常见问题解答,以及一些最佳实践。这份文档对于理解Compass的工作原理和实际应用是非常有价值的。 `lucene总结.chm`和`...
它建立在Lucene之上,但提供了一个更为简单和统一的接口,使开发者可以轻松地集成搜索功能到他们的应用中。 #### 2. Lucene概述 **Lucene** 是一个高性能、全功能的全文搜索引擎库。它为开发者提供了创建搜索应用...
总的来说,这份Elasticsearch笔记是一份详尽的学习资料,涵盖了从基础概念到高级特性的全面内容,适合初学者和进阶者参考学习。通过阅读和实践,读者将能够熟练掌握Elasticsearch的使用,解决实际工作中的各种问题。
“搜索笔记.doc”可能是个人或团队整理的学习笔记,涵盖了搜索引擎和信息获取技术的实践经验、技巧和心得,对于深化理解这些概念和技术可能会非常有帮助。 总的来说,这个压缩包包含的资源提供了丰富的搜索引擎与...
Elasticsearch是一种基于Lucene的搜索引擎,它提供了一个分布式多用户的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可下的开源代码发布。它的主要特点包括:分布式实时文件...
1. **基础概念**:Elasticsearch是一种基于Lucene的分布式、实时、可扩展的搜索和分析引擎,提供全文检索、结构化搜索、近实时搜索以及数据分析等功能。书中会详细介绍这些核心概念,帮助读者建立基本的认识。 2. *...
总的来说,"Java论坛管理系统设计"项目涵盖了Java Web开发的多个重要环节,对于初学者来说,通过该项目的学习,可以深入理解Java Web开发的全貌,提高实际开发能力。同时,源代码的分析和调试也是提升编程技能的有效...