这一部分能够参考我之前写的博客:html
http://www.cnblogs.com/skyme/tag/lucene/java
下图是一个很好的说明:web
一、lucene是构建索引、查询、高亮、拼写检查的类库。缓存
二、它不是一个爬虫。服务器
三、不提供分布式的索引。多线程
这是用4.6版本构建的lucene构建索引和查询的示例:架构
public static void main(String[] args) throws IOException, ParseException { // 1、建立索引 // 内存索引模板 Directory dir = new RAMDirectory(); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer); IndexWriter indexWriter = new IndexWriter(dir, config); Document doc = new Document(); String title = "标题"; String content = "被索引的内容"; Field f1 = new Field("title", title, TextField.TYPE_STORED); Field f2 = new Field("content", content, TextField.TYPE_STORED); doc.add(f1); doc.add(f2); indexWriter.addDocument(doc); indexWriter.close(); // 2、搜索 DirectoryReader directoryReader = DirectoryReader.open(dir); IndexSearcher indexSearcher = new IndexSearcher(directoryReader); QueryParser parser = new QueryParser(Version.LUCENE_46, "content", analyzer); Query query = parser.parse("内容"); TopDocs topDocs = indexSearcher.search(query, null, 100); ScoreDoc[] hits = topDocs.scoreDocs; System.out.println("查询结果数:" + hits.length); for (int n = 0; n < hits.length; n++) { Document hitDoc = indexSearcher.doc(hits[n].doc); System.out.println("搜索的结果title:" + hitDoc.get("title")); } }
上面是一个简单的在内存中构建索引而且进行查询的例子。app
而后看一下lucene索引用到的类:框架
再看一下查询用到的类:分布式
索引的过程能够简述为:
这部份内容能够参考:
http://www.cnblogs.com/hongten/archive/2013/02/01/hongten_lucene_baidu.html
FSDirectory
FSDirectory是Lucene对文件系统的操做,它有下面三个子类SimpleFSDirectory、MmapDirectory、NIOFSDirectory;
FSDirectory是一个抽象类,具体实现由子类来完成。
一、SimpleFSDirectory
最简单的FSDirectory子类,使用java.io.*API将文件存入文件系统中,不能很好支持多线程操做。由于要作到这点就必须在内部加入锁,而java.io.*并不支持按位置读取。
二、NIOFSDirectory
使用java.io.*API所提供的位置读取接口,能很好的支持除Windows以外的多线程操做,缘由是Sun的JRE在Windows平台上长期存在问题。
NIOFSDirectory在Windows操做系统的性能比较差,甚至可能比SimpleFSDirecory的性能还差。
三、MmapDirectory
使用内存映射的I/O接口进行读操做,这样不须要采起锁机制,并能很好的支持多线程读操做。但因为内存映射的I/O所消耗的地址空间是与索引尺寸相等,因此建议最好只是用64位JRE。
queryparser的解析过程:
一、使用queryparser完成解析搜索请求
二、基本格式如:
QueryParser parser=new QueryParser("字段名称","分析器实例");
Query q=parser.parse("关键词")
三、例如:解析一个关键字太阳
QueryParser parser=new QueryParser("context",new StandardAnalyzer());
Query q=parser.parse("太阳");
IndexSearcher searcher=new IndexSearcher(indexpath);
Hits hit=searcher.search(q);
四、解析多个关键字太阳、月亮
QueryParser parser=new QueryParser("context",new StandardAnalyzer());
Query q=parser.parse("太阳 月亮");
IndexSearcher searcher=new IndexSearcher(indexpath);
Hits hit=searcher.search(q);
四、带参数的多个关键字解析
QueryParser parser=new QueryParser("context",new StandardAnalyzer());
Query q=parser.parse("太阳 月亮");
parser.setDefaultOperator(QueryParser.Opertator.AND);//同时含有多个关键字,若是是QueryParser.Opertator.OR表示或者
IndexSearcher searcher=new IndexSearcher(indexpath);
Hits hit=searcher.search(q);
下图是搜索用到的相关的类:
一、solr
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。文档经过Http利用XML加到一个搜索集合中。查询该集合也是经过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,经过索引复制来提升可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
二、ElasticSearch
ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。设计用于云计算中,可以达到实时搜索,稳定,可靠,快速,安装使用方便。支持经过HTTP使用JSON进行数据索引。
三、IndexTank
IndexTank是一套基于Java的索引-实时全文搜索引擎实现,它的设计分离了相关性标记和文档内容,由于相关性标记的生命周期和文档自己是不同的,特别是在用户建立的内容的状况下,例如分享次数,Like按钮,+1按钮等等。
四、Katta
Katta是一个可扩展的、故障容错的、分布式实施访问的数据存储。
Katta可用于大量、重复、索引的碎片,以知足高负荷和巨大的数据集。这些索引能够是不一样的类型。当前该实如今Lucene和Hadoop mapfiles。
五、bobo-browse
bobo-browse是一用java写的lucene扩展组件,经过它能够很方便在lucene上实现分组统计功能。
好比说搜索电脑,能够获得cpu是intel的有几条命中记录,cpu是amd的有几条命中记录。
六、Compass
Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架。Compass包括:
七、Summa
Summa是一种由java开发的,快速模块化和可扩展的搜索引擎。Summa有以下特色:
八、Constellio
Constellio是一个开源的搜索解决方案,适合企业级的搜索。基于Apache Solr项目构建,使用Lucene作为搜索引擎,并提供基于Web的网页和文档的检索。可选择文档类型、文件夹以及文件名进行检索。
下面给出一个咱们实际过程当中的使用模型,用于比对系统中的类目关系:
上图中的匹配过滤功能使用lucene完成。