全文检索——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 {/*** 创建索引*/@Testpublic 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();}/** 搜索的过程*/@Testpublic 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 DocumentScoreDoc[] 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());}}
}
全文检索——Lucene相关推荐
- 全文检索Lucene
全文检索Lucene lucene入门 什么是lucene Lucene的作用 使用场景 优点和缺点 lucene应用 索引流程 搜索流程 field域的使用 索引库维 ...
- 全文检索 Lucene
全文检索 Lucene 网上学习黑马课程后,在原有笔记的基础上进行总结 课程计划 lucene入门 什么是lucene Lucene的作用 使用场景 优点和缺点 lucene应用 索引流程 搜索流程 ...
- 全文检索lucene中文分词的一些总结
为什么80%的码农都做不了架构师?>>> 全文检索几乎是所有内容管理系统软件(CMS)必备的功能,在对公司的CMS产品的开发维护过程中,全文检索始终是客户重点关注的模块,为满足 ...
- 全文检索Lucene(一)--Document操作与文本域加权
一.搭建基本环境 在eclipse中创建普通的maven项目,并在pom.xml中引入相应的依赖. 这里只给出pom.xml中的依赖 <dependencies> ...
- ajax+lucene pdf,基于Ajax/Lucene的站内搜索技术研究
摘要: 站内搜索引擎是找出网站重要信息的必要工具,高效的站内搜索将有助于提升网站的价值,发挥网站应有的作用.虽然现在一些网络巨头已开始研究并应用这类工具,但整个互联网行业中,受制于技术的门槛,真正的站 ...
- Lucene-01 全文检索基本介绍
文章目录 课程计划 什么是全文检索 数据分类 结构化数据搜索 非结构化数据查询方法 如何实现全文检索 全文检索的应用场景 Lucene实现全文检索的流程 索引和搜索流程图 创建索引 获得原始文档 创建 ...
- lucene ---- 黑马教程
https://www.bilibili.com/video/BV1eJ411q7nw/?spm_id_from=333.337.search-card.all.click 文章目录 全文检索Luce ...
- java徐仕锋_传智播客云计算开发 Hadopp视频教程 传智播客之javaEE + Hadoop...
课程介绍 本套教程课件+代码+PPT+文档齐全!java零基础入门的高端课程 小白的最好教程,27天学会Java基础,80天左右学会JavaEE开发.包括最新的ssh国家税务协同平台项目,ssm进销存 ...
- .NET常用第三方库(包)总结
序列化与反序列化 JSON.NET 应该是.NET平台上使用最为广泛的序列化/反序列化包了,ASP.NET和ASP.NET Core中默认序列化/反序列化包 Jil 官网上说性能优于JSON.NET ...
- java 开源控件_一些好用的开源控件
工作两年,一直都在做些编码方面的表面功夫,实现了很多很炫的功能,在此写下一些体验.有些比较小的dll文件我会发上来,如果是开源组织的代码我会把地址附上,毕竟人家是会更新的.大家还有什么好用的开源控件欢 ...
最新文章
- leetcode 202 快乐数
- 大型网站技术架构(2):架构要素和高性能架构
- es6 Promise
- A beginner’s guide to Cache synchronization strategies--转载
- 理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤
- Codeforces Round #739 (Div. 3)(AK实况)
- java中使用jython_将Jython嵌入到您的Java代码库中
- Nginx之开门见山
- 数字图像处理与机器视觉_简单自动智能识别物体程序(机器视觉+数字图像处理)...
- Cadence 17.4 等长布线
- Appium Desktop下载
- 粒子群算法(PSO)求解TSP问题
- 项目接力:售前、售中、售后
- java创建动态数组_动态数组java实现
- Redis中的事务和三特性
- OSChina 周五乱弹 —— 企鹅尼克号
- 30天自制操作系统——第一天到第二天
- 游戏,让学习成瘾pdf_设计上瘾的视频游戏
- littleVGL学习笔记8——lv_cont 容器
- oracle10g windows7
热门文章
- 微信屏蔽网址的解决办法:366API轻松实现被微信屏蔽的网址在微信内正常访问
- 图像宽度所占字节必须是4的倍数详解
- mysql 保存昵称_mysql 微信用户昵称emoji 完整保存
- 团队管理8--管理工作框架及技能图谱
- 【修真院“善良”系列之十】初级Java程序员的学习路线 1
- C编译中的语法检查和语义检查
- 修改服务器的ip地址的命令,使用命令提示符更改IP地址和DNS服务器 | MOS86
- 利用SuperMap的水文分析提取山脊线和山谷线
- 修复VSAN无法看到的主机磁盘
- c51语言访问绝对地址的方法,51单片机绝对地址访问的两种方法