全文检索——Lucene

简介: 简单介绍:  全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。  像我们平时用的百度谷歌搜索引擎,当我们在输入框输入任意内容后点击搜索,搜索引擎就会把与我们搜索内容相关的内容全部检索到,并按照一定的排序规则呈现给我们。

简单介绍:

  全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法。全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。

  像我们平时用的百度谷歌搜索引擎,当我们在输入框输入任意内容后点击搜索,搜索引擎就会把与我们搜索内容相关的内容全部检索到,并按照一定的排序规则呈现给我们。

  

  Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。我们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

  下面我们就实现一个简单的例子,结合实例给大家讲解Lucene的工作机制。

代码结构:


整个实例的实现思路:

1.创建一个article对象,把该对象放到索引库中

1、创建一个article对象
2、把article对象转化成document对象
3、创建一个IndexWriter对象
4、把document对象加入到索引库中

 2.从索引库中把article对象检索出来

   1、创建一个IndexSearch对象

2、创建一个QueryParser对象

3、将document对象转换为article对象

代码:

package com.tgb.lucene.bean;

public class Article {
	private Long id;
	private String title;
	private String content;
	public Long getId() {
		return id;
	}
	public void setId(Long i) {
		this.id = i;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
}
package com.tgb.lucene.helloworld;

import java.io.File;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

import com.tgb.lucene.bean.Article;
/**
 * 1.创建一个article对象,把该对象放到索引库中
 * 2.从索引库中把article对象检索出来
 * @author hongxin
 *
 */
public class HelloWorld {

	/**
	 * 创建索引
	 */
	@Test
	public void testCreateIndex() throws Exception{
		/**
		 * 1、创建一个article对象
		 * 2、把article对象转化成document对象
		 * 3、创建一个IndexWriter对象
		 * 4、把document对象加入到索引库中
		 */
		
		Article article = new Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜索引擎");
		article.setContent("baidu,google都是很好的搜索引擎");
		
		Document document = new Document();
		/**
		 * 第一个参数
		 *    放入到索引库中的name的名称"id"
		 * 第二个参数
		 *    放入到索引库中的value:id的值 
		 * 第三个参数
		 *    Store
		 *       YES  该字段向内容库中存储
		 *       no   该字段不向内容库中存储
		 * 第四个字段
		 *    Index
		 *       no   不向目录库中存储
		 *       NOT_ANALYZED  存储,但是不分词
		 *       ANALYZED      存储,分词
		 */
		Field idField = new Field("id", article.getId().toString(), Store.YES, Index.NOT_ANALYZED);
		Field titleField = new Field("title", article.getTitle(),Store.NO,Index.ANALYZED);
		Field contentField = new Field("content", article.getContent(), Store.YES, Index.ANALYZED);
		
		document.add(idField);
		document.add(titleField);
		document.add(contentField);
		
		//索引库
		Directory directory=FSDirectory.open(new File("./indexDir"));
		//分词器
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
		/**
		 * directory指向了索引库的路径  "./indexDir"
		 * analyzer 分词器  把title,content的内容分词后的内容放入到目录中
		 * MaxFieldLength 限制每一个字段往索引库中存放的大小
		 */
		IndexWriter indexWriter = new IndexWriter(directory,analyzer, MaxFieldLength.LIMITED);
		indexWriter.addDocument(document);
		
		indexWriter.commit();
		indexWriter.close();
	}
	
	/*
	 * 搜索的过程
	 */
	@Test
	public void testSearchIndex() throws Exception{
		//索引库
		Directory directory = FSDirectory.open(new File("./indexDir"));
		/**
		 * 创建一个IndexSearch对象
		 */
		IndexSearcher indexSearcher = new IndexSearcher(directory);
		
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
		/**
		 * 第一个参数
		 *     版本号
		 * 第二个参数
		 *     在哪个字段中进行检索
		 * 第三个参数
		 *     为分词器,在调用queryParser的parse方法的时候,需要对参数再次进行分词
		 */
		QueryParser queryParser = new QueryParser(Version.LUCENE_30, "title", analyzer);
		Query query = queryParser.parse("lucene");
		/**
		 * query参数
		 *     包含了一个分词器
		 *     包含了一个关键词
		 * n 查找前n条记录
		 * TopDocs==Top Documents  前一些Documents
		 */
		TopDocs topDocs = indexSearcher.search(query, 1);
		int count = topDocs.totalHits;  // 根据关键词计算出来的总的记录数
		//ScoreDoc= Score  Document
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		List<Article> articles = new ArrayList<Article>();
		for (ScoreDoc scoreDoc : scoreDocs) {
			float score = scoreDoc.score;//相关度得分
			//scoreDoc.doc  根据关键词找到的索引
			Document document = indexSearcher.doc(scoreDoc.doc);
			//Document转化成article的过程
			Article article = new Article();
			article.setId(Long.parseLong(document.get("id")));
			article.setTitle(document.get("title"));
			article.setContent(document.get("content"));
			articles.add(article);
		}
		
		for (Article article : articles) {
			System.out.println(article.getId());
			System.out.println(article.getTitle());
			System.out.println(article.getContent());
		}
	}
}



目录
相关文章
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
1386 0
|
Java 调度 Windows
JAVA面试八股文之多线程基础知识
JAVA面试八股文之多线程基础知识
|
存储 搜索推荐 Oracle
什么是全文搜索引擎
什么是全文搜索引擎
|
存储 缓存 移动开发
HTML5 的离线储存怎么使用,工作原理
HTML5 的离线储存怎么使用,工作原理
282 0
|
域名解析 网络协议
阿里云如何找回域名,进行添加或删除?
阿里云如何找回域名,进行添加或删除?
|
Java 关系型数据库 MySQL
springboot+vue外卖点餐系统(源码+文档)
基于SpringBoot的外卖点餐系统包括管理员、用户、商家和骑手四个角色的功能模块。系统采用Java开发,使用SpringBoot框架,JDK1.8,MySQL 5.7+数据库。管理员功能涉及用户、商家、菜品分类、骑手和系统管理等,用户可进行订单、配送单、商品评价和收藏管理。商家和骑手也有相应的订单、配送单和评价管理。此外,提供各类Java毕设项目,涵盖多种框架。项目源码及更多信息可联系风歌获取。
包管理工具——npm实用教程 (修改下载源,安装依赖 -D -S -g ,卸载依赖等)
包管理工具——npm实用教程 (修改下载源,安装依赖 -D -S -g ,卸载依赖等)
352 0
|
存储 缓存 网络协议
|
SQL 开发框架 安全
CTF基础 --隐写术与密码学编码
CTF基础 --隐写术与密码学编码
220 0
|
机器学习/深度学习 算法 C#
C# | 凸包算法之Jarvis,寻找一组点的边界/轮廓
这篇关于凸包算法的文章,本文使用C#和Jarvis算法来实现凸包算法。 首先消除两个最基本的问题: 什么是凸包呢? 凸包是一个包围一组点的凸多边形。凸多边形是指多边形中的每个内角都小于180度的多边形。 凸包算法有什么用呢? 凸包算法的作用是找到这个凸多边形,并且使用最少的点来绘制出它的轮廓。凸包算法在计算机图形学、计算几何和机器学习等领域中有着广泛的应用。
191 0