`
a14400610
  • 浏览: 6599 次
社区版块
存档分类
最新评论

Lucene的介绍

    博客分类:
  • JAVA
阅读更多

1 lucene简介
1.1
什么是lucene
    Lucene
是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。
2 lucene
的工作方式
    lucene
提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。
2.1
写入流程
   
源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。
将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。
   
将索引写入存储器,存储器可以是内存或磁盘。
2.2
读出流程
   
用户提供搜索关键词,经过analyzer处理。
对处理后的关键词搜索索引找出对应的Document
用户根据需要从找到的Document中提取需要的Field
3
一些需要知道的概念
3.1 analyzer
    Analyzer
是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”“the”,中文中的等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。
  分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。
3.2 document
  用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。
3.3 field
   
一个Document可以包含多个信息域,例如一篇文章可以包含标题正文最后修改时间等信息域,这些信息域就是通过FieldDocument中存储的。
    Field
有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。
3.4 term
  term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field
3.5 tocken
    tocken
term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。
3.6 segment
   
添加索引时并不是每个document都马上添加到同一个索引文件,它们首先被写入到不同的小文件,然后再合并成一个大索引文件,这里每个小文件都是一个segment
4
如何建索引
4.1
最简单的能完成索引的代码片断

 

/**
	 * 添加列表到索引库中
	 * @yijianfeng
	 * @param list
	 * @throws IOException
	 */
	public void writeIndex(List<LucenceVo> list) throws IOException {
		IndexWriter writer = openIndexWriter();
		try {
			for (LucenceVo lucenceVo : list) {
				Document document = builderDocument(lucenceVo);
				writer.addDocument(document);
			}
		} finally {
			writer.close();
		}
	}

	/**
	 * 添加单个到索引库中
	 * @yijianfeng
	 * @param LucenceVo
	 * @throws IOException
	 */
	public void writeIndex(LucenceVo vo) throws IOException {
		IndexWriter writer = openIndexWriter();
		try {
			Document document = builderDocument(vo);
			writer.addDocument(document);
		} finally {
			writer.close();
		}
	}
	
	
	@SuppressWarnings("static-access")
	private Document builderDocument(LucenceVo lucenceVo) throws FileNotFoundException {
		Document document = new Document();
		Field id = new StringField(lucenceVo.ID, String.valueOf(lucenceVo.getId()),
				Field.Store.YES);
		Field TITLE = new StringField(lucenceVo.TITLE, lucenceVo.getTitle(),
				Field.Store.YES);
		Field CONTENT = new TextField(lucenceVo.CONTENT, lucenceVo.getContent(),Field.Store.YES);
		Field URL = new StringField(lucenceVo.URL, lucenceVo.getUrl(),Field.Store.YES);
		document.add(id);
		document.add(TITLE);
		document.add(CONTENT);
		document.add(URL);
		return document;
	}

	private IndexWriter openIndexWriter() throws IOException {
                File index_file = new File("d:\\lun");
                Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_46);
		IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_46,
				analyzer);
		//索引 设置为追加或者覆盖
		indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
		return new IndexWriter(FSDirectory.open(index_file), indexWriterConfig);
	}

        	public void testwirte(){
		List list = new ArrayList();
		for (int i = 0; i < 10000; i++) {
			LucenceVo vo = new LucenceVo();
			vo.setId("myid"+i);
			vo.setTitle("中国今天新闻"+i);
			vo.setContent("中国酸辣粉为适当放宽为肌肤我始终是中国斯科拉的风景我");
			vo.setType("新闻");
			vo.setUrl("http://www.baidu.com/?id="+i);
			list.add(vo);
		}
		try {
			writeIndex(list);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	

 下面我们分析一下这段代码。

首先我们创建了一个writer,并指定存放索引的目录为d:\lun,使用的分析器为SmartChineseAnalyzer(中文专用分词),然后我们新建一个document
  我们向document添加一个field,名字是“title”,内容是“lucene introduction”,对它进行存储并索引。再添加一个名字是“content”field,内容是“lucene works well”,也是存储并索引。
然后我们将这个文档添加到索引中,如果有多个文档,可以重复上面的操作,创建document并添加
  
随后将writer关闭,这点很重要。
  
对,创建索引就这么简单!
 
当然你可能修改上面的代码获得更具个性化的服务。
5.搜索
  5.1来看一些在lucene中使用的术语,这里并不打算作详细的介绍,只是点一下而已----因为这一个世界有一种好东西,叫搜索。

IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。

Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

Directory:索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectoryRAMDirectory两个类。

Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。

Field:字段。

IndexSearcher:lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;

Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。

QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。

Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。

 

/**
	 * 索引库中查询
	 * @param keyword
	 * @return
	 * @yijianfeng
	 */
	public List<LucenceVo> searchIndex(String keyword,int start,int size)  {
		IndexSearcher searcher = null;
		List<LucenceVo> list = new ArrayList<LucenceVo>();
		if(!havapath){
			return list;
		}
		try {
			IndexReader reader = DirectoryReader.open(FSDirectory.open(index_file));
			searcher = new IndexSearcher(reader);
			Query query =parser.parse(keyword);
			TopDocs topDocs = searcher.search(query, (size+start));
			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
			int end = (size+start)<topDocs.totalHits?(size+start):topDocs.totalHits;
			for (int i = start; i < end; i++) {
				Document doc = searcher.doc(scoreDocs[i].doc);
				LucenceVo info = new LucenceVo();
				//关键词加亮
				SimpleHTMLFormatter simpleHTMLFormatter = new  SimpleHTMLFormatter(prefixHTML, suffixHTML); 
				Highlighter highlighter = new  Highlighter(simpleHTMLFormatter, new QueryScorer(query)); 
				highlighter.setTextFragmenter(new SimpleFragmenter(textmaxlength));
				String CONTENT = highlighter.getBestFragment(analyzer,LucenceVo.CONTENT,doc.get(LucenceVo.CONTENT)); 
				String TITLE = highlighter.getBestFragment(analyzer,LucenceVo.TITLE,doc.get(LucenceVo.TITLE)); 
				if(CONTENT==null)
				{
					info.setContent(doc.get(LucenceVo.CONTENT));
				}
				else
				{
					info.setContent(CONTENT);
				}
				if(TITLE==null){
					info.setTitle(doc.get(LucenceVo.TITLE));
				}else{
					info.setTitle(TITLE);
				}
				//取消重复加亮节点
				TITLE = info.getTitle().replaceAll(suffixHTML+prefixHTML, "");
				CONTENT = info.getContent().replaceAll(suffixHTML+prefixHTML, "");
				//实体赋值
				info.setId(doc.get(LucenceVo.ID));
				info.setTitle(TITLE);
				info.setUrl(doc.get(LucenceVo.URL));
				list.add(info);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

 PS:这里使用的是4.6版本,4.7及以后的版本需要使用JDK1.7在JDK1.6上使用会报错

分享到:
评论

相关推荐

    Lucene介绍的PPT

    【Lucene介绍】 Lucene是一个基于Java的全文检索库,由Apache软件基金会的Jakarta项目维护。它不是一个完整的全文搜索引擎,而是一个可嵌入到其他应用程序中的库,用于实现高效、快速的全文检索功能。Lucene的目标...

    开源搜索框架lucene介绍

    ### 开源搜索框架Lucene介绍 #### 一、Lucene简介 Lucene是一款非常优秀且成熟的开源全文索引检索工具包,它完全采用Java语言编写,由Doug Cutting于1999年创建,并于2001年10月捐赠给了Apache基金会,成为Apache...

    Lucene介绍,全文检索

    **Lucene介绍** Lucene是一个基于Java的全文索引工具包,由Doug Cutting创建,最初在www.lucene.com发布,后来成为Apache基金会Jakarta项目的一部分。Lucene不是完整的全文搜索引擎应用,而是一个可嵌入到其他应用...

    Lucene介绍+源码解读+功能分析

    ### Lucene介绍与源码解读 #### 一、Lucene概述 Lucene是一个开放源代码的全文检索引擎工具包,由Doug Cutting所创立,并于2002年捐赠给了Apache基金会。Lucene并非一个完整的搜索引擎解决方案,而是一个提供全文...

    Lucene介绍与入门使用 - 高压锅里的小白 - 博客园1

    【Lucene介绍与入门使用】 Lucene是一款由Apache软件基金会开发的开源全文检索引擎工具包。它不是一个完整的全文检索引擎,而是提供了一套强大的搜索引擎和索引引擎的架构,允许开发者在自己的应用程序中轻松实现...

    Lucene简介.介绍

    【Lucene 简介】 Lucene 是一个强大的开源全文搜索库,由 Java 编写,主要用于为应用程序添加全文检索功能。它不是一个完整的全文搜索引擎应用,而是一个工具包,允许开发者将其集成到自己的软件中,以实现高效、...

    Lucene介绍视频教程

    x-oss-process=style/pnp8(39.97KB,下载次数:225)下载附件2019-10-2502:02上传〖课程介绍〗:Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎。Lucene的目的是为软件开发人员...

    lucene in action 第二版英文版

    1. **Lucene介绍**:本书全面介绍了Apache Lucene 3.0版本的核心功能、特性和用法。 2. **搜索技术**:深入探讨了文本搜索的基础原理及在现代信息检索系统中的应用。 3. **API详解**:提供了丰富的代码示例,详细...

    Lucene的简单介绍

    Apache Lucene是一个非常流行的开源全文检索库,由Apache软件基金会提供。它为开发者提供了构建全文搜索功能的工具包,包括完整的查询引擎和索引引擎。Lucene的目标是为软件开发人员提供简单易用的工具包,方便地在...

    详解SpringBoot+Lucene案例介绍

    本文将详细介绍如何将SpringBoot与Lucene集成,以实现站内搜索系统。 Lucene是一个高性能的全文检索引擎,它可以帮助我们快速地检索大量的文本数据。 一、案例介绍 在本案例中,我们将创建一个商品的站内搜索系统...

    解密搜索引擎技术实战-Lucene&java;精华版

    在全文检索部分,结合Lucene介绍了搜索引擎的原理与进展。用简单的例子介绍了Lucene的最新应用方法,包括完整的搜索实现过程:从完成索引到搜索用户界面的实现。此外还进一步介绍了实现准实时搜索的方法,展示了Solr...

    1.解密搜索引擎技术实战:Lucene&Java;精华版(第3版)

    本书总结搜索引擎相关理论与实际解决方案,并给出了Java...在全文检索部分,结合Lucene介绍了搜索引擎的原理与进展。用简单的例子介绍了Lucene的应用方法,包括完整的搜索实现过程:从完成索引到搜索用户界面的实现。

    Lucene初级教程

    doc.add(new Field("title", "Lucene介绍", Field.Store.YES, Field.Index.ANALYZED)); // 添加正文字段 doc.add(new Field("content", "Lucene是一个高性能的全文检索库。", Field.Store.YES, Field.Index....

    传智播客Lucene3.0_精品课程

    - **Lucene介绍**:Lucene是一个开源的全文检索库,它提供了构建全文检索应用所需的所有基本功能,包括索引建立、搜索、查询解析等。 - **Lucene版本**:本课程使用的Lucene版本为3.0.1。 - **全文检索的工作流程**...

    lucene简单介绍及solr搭建使用

    标题“lucene简单介绍及solr搭建使用”涉及了两个主要的开源搜索技术:Lucene和Solr。Lucene是Java开发的一个全文检索库,而Solr则是基于Lucene构建的企业级搜索平台,提供了更高级的功能和管理界面。 **Lucene简介...

    经典的lucene实例代码及详细解析以及lucene结构流程介绍

    经典的Lucene实例代码及详细解析以及Lucene结构流程介绍 Lucene是一个功能强大且灵活的开源搜索引擎库,它提供了一个简单易用的API,允许开发者快速构建搜索应用程序。下面将对Lucene的实例代码和结构流程进行详细...

    Lucene3.教程.ppt(学习的ppt)

    Java全文检索器 Lucene3.6教程 ...Lucene介绍、结构分析 Lucene的全文索引实现 Lucene原理分析、优化 中文分词器使用 高亮器的使用 过滤与排序 常见的各种搜索 如果需要源码的,请到我的资源去找,谢谢

Global site tag (gtag.js) - Google Analytics