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

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简介.介绍

    Lucene简介.介绍Lucene简介.介绍

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

    1. Lucene介绍与入门使 2. 解决windows10和u 3. 在一台电脑上运行两 4. WebService的简单介 1. Lucene介绍与入门使

    Lucene介绍视频教程

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

    Lucene介绍,全文检索

    具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展 从Lucene我们还可以学到什么 另外,如果是在选择全文引擎,现在也许是试试Sphinx的时候了:...

    Lucene介绍的PPT

    Lucene API的介绍,适合入门的人学习.包括全文索引文件的基本结构.

    开源搜索框架lucene介绍

    Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。 2001年10月贡献给APACHE,成为APACHE基金的一个子项目。 开源,可扩展能力强,有各种语言版本,适合各种平台,

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

    Lucene源码解读、功能分析,Lucene入门

    lucene实现全文搜索

    全文检索介绍 索引 分词 Lucene介绍 Lucene应用详解 索引器 检索器 条件查询 实用工具及高亮器 Lucene综合应用——仿搜索引擎

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

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

    Lucene的简单介绍

    Lucene的简单介绍,也介绍了搜索的原理,非常简短,适合入门的使用

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

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

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

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

    lucene的简单介绍以及使用

    本文是整理的关于lucene的一些简单的介绍,以及对于lucene的简单的使用。

    Lucene 常用功能介绍视频详解

    Lucene 常用功能介绍,视频详解,带课程文档Lucene 常用功能介绍

    LUCENE分析介绍功能

    文本分析的高级算法 有详细论文介绍LUCENE分析介绍功能

    详解SpringBoot+Lucene案例介绍

    主要介绍了详解SpringBoot+Lucene案例介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    lucene笔记

    1、 Lucene介绍 a) 什么是lucene b) 全文检索的应用场景 c) 全文检索定义 2、 Luence实现全文检索的流程(重点) 3、 入门程序 4、 Field域(重点) 5、 索引维护 a) 添加索引 b) 删除索引 c) 修改索引 6、 搜索...

    lucene简单介绍及solr搭建使用

    lucene的应用.pdf 01solr企业级搜索引擎准备阶段.pdf 02solr企业级搜索引擎实战演练.pdf 适合新手搭建solr使用

    lucene in action_中文版(lucene实战)

    本书深入浅出地介绍了Lucene——一个开源的使用Java语言编写的全文搜索引擎开发包。它通过浅显的语言、大量的图注、丰富的代码示例,以及清晰的结构为读者呈现出作为优秀开源项目的Lucene 所体现的强大功能。全书共...

Global site tag (gtag.js) - Google Analytics