Java微服务篇3——Lucene

1、数据分类

1.1、结构化数据

具有固定格式或有限长度的数据,如数据库,元数据等

常见的结构化数据也就是数据库中的数据,在数据库中搜索很容易实现,通常都是使用 sql语句进行查询,而且能很快的得到查询结果

数据库中的数据存储是有规律的,有行有列而且数据格式、数据长度都是固定的,所以搜索很容易

1.2、非结构化数据

不定长或无固定格式的数据,如邮件,word 文档等磁盘上的文件

1.2.1、顺序扫描

顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文 档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫 描完所有的文件。如利用 windows 的搜索也可以搜索文件内容,只是相当的慢

1.2.2、全文检索

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在 文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果 反馈给用户的检索方法。这个过程类似于通过字典的目录查字的过程

2、全文检索(Lucene)

Lucene 是 apache 下的一个开放源代码的全文检索引擎工具包。提 供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言),Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。

2.1、Lucene优点

稳定、索引性能高

  • 每小时能够索引150GB以上的数据
  • 对内存的要求小,只需要1MB的堆内存
  • 增量索引和批量索引一样快
  • 索引的大小约为索引文本大小的20%~30%

高效、准确、高性能的搜索算法

  • 良好的搜索排序
  • 强大的查询方式支持:短语查询、通配符查询、临近查询、范围查询等
  • 支持字段搜索(如标题、作者、内容) 可根据任意字段排序
  • 支持多个索引查询结果合并
  • 支持更新操作和查询操作同时进行
  • 支持高亮、join、分组结果功能
  • 速度快
  • 可扩展排序模块,内置包含向量空间模型、BM25模型可选
  • 可配置存储引擎

跨平台

  • 纯java编写
  • 作为Apache开源许可下的开源项目,你可以在商业或开源项目中使用
  • Lucene有多种语言实现版(如C,C++、Python等),不仅仅是JAVA

2.2、架构图


2.3、Lucene实现全文检索流程

2.4、应用场景

单机软件的搜索:word、markdown

站内搜索:京东、淘宝、拉勾,索引源是数据库

搜索引擎:百度、Google,索引源是爬虫程序抓取的数据

3、Lucene实战

3.1、项目搭建

job_info.sql文件 百度云:https://pan.baidu.com/s/1Iw7Hfd4kHSVptDKdQ2bmaQ提取码:m27x

导入依赖

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>4.10.3</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId><version>4.10.3</version></dependency></dependencies>

实体类

public class JobInfo {private Long id;private String company_name;private String company_addr;private String company_info;private String job_name;private String job_addr;private String job_info;private int salary_min;private int salary_max;private String url;private String time;
}

mapper

@Mapper
public interface JobInfoMapper {@Select("select * from job_info")public List<JobInfo> selectJobInfo();
}

service

public interface JobInfoService {public List<JobInfo> selectJobInfo();
}
@Service
public class JobInfoServiceImpl implements JobInfoService {@AutowiredJobInfoMapper jobInfoMapper;@Overridepublic List<JobInfo> selectJobInfo() {return jobInfoMapper.selectJobInfo();}
}

controller

@RestController
public class JobInfoController {@AutowiredJobInfoServiceImpl jobInfoService;@RequestMapping("/")public String hello(){return "hello,lucene!";}@RequestMapping("/selectJobInfo")public List<JobInfo> selectJobInfo(){return jobInfoService.selectJobInfo();}
}

application.yaml

mybatis:type-aliases-package: cn.winkto.beanmapper-locations: classpath:mapper/*.xml
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: blingbling123.url: jdbc:mysql://localhost:3306/job?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiapplication:name: product
server:port: 8099

启动类

@SpringBootApplication
@MapperScan("cn.winkto.mapper")
public class LuceneApplication {public static void main(String[] args) {SpringApplication.run(LuceneApplication.class, args);}}

3.2、Filed类型

Field类型 数据类型 是否分词 是否索引 是否存储 说明
StringField(FieldName, FieldValue, Store.YES) 字符串 N Y Y/N 字符串类型Field, 不分词, 作为一个整体进行索引(如: 身份证号, 订单编号), 是否需要存储由Store.YES或Store.NO决定
StoredField(FieldName, FieldValue) 重载方法, 支持多种类型 N N Y 构建不同类型的Field, 不分词, 不索引, 要存储. (如: 商品图片路径)
TextField(FieldName, FieldValue, Store.NO) 文本类型 Y Y Y/N 文本类型Field, 分词并且索引, 是否需要存储由Store.YES或Store.NO决定

3.3、索引创建

@SpringBootTest
class LuceneApplicationTests {@AutowiredJobInfoServiceImpl jobInfoService;@Testvoid contextLoads() throws IOException {// 索引文件存储的位置 D:\indexDirectory directory= FSDirectory.open(Paths.get("D:\\index"));// 分词器StandardAnalyzer standardAnalyzer = new StandardAnalyzer();// 索引创建配置对象IndexWriterConfig indexWriterConfig = new IndexWriterConfig(standardAnalyzer);// 索引创建对象IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);// 删除已有索引indexWriter.deleteAll();// 元数据查询List<JobInfo> jobInfos = jobInfoService.selectJobInfo();for (JobInfo jobInfo : jobInfos) {// 文档对象 import org.apache.lucene.document.*;Document indexableFields = new Document();// 添加元数据indexableFields.add(new StringField("id", String.valueOf(jobInfo.getId()), Field.Store.YES));indexableFields.add(new TextField("companyName", jobInfo.getCompany_name(), Field.Store.YES));indexableFields.add(new TextField("companyAddr", jobInfo.getCompany_addr(), Field.Store.YES));// 添加文档indexWriter.addDocument(indexableFields);}indexWriter.close();}
}

3.4、索引查询

@Test
void contextLoads1() throws IOException {// 索引文件存储的位置 D:\indexDirectory directory= FSDirectory.open(Paths.get("D:\\index"));DirectoryReader reader = DirectoryReader.open(directory);IndexSearcher indexSearcher = new IndexSearcher(reader);TermQuery termQuery = new TermQuery(new Term("companyName", "北"));TopDocs search = indexSearcher.search(termQuery, 100);System.out.println(search.totalHits);ScoreDoc[] scoreDocs = search.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {int id=scoreDoc.doc;Document doc = indexSearcher.doc(id);System.out.println(doc.get("companyName"));System.out.println("========================");}
}

3.5、中文分词器

导入依赖

<dependency><groupId>com.janeluo</groupId><artifactId>ikanalyzer</artifactId><version>2012_u6</version>
</dependency>

测试类

@SpringBootTest
class LuceneApplicationTests {@AutowiredJobInfoServiceImpl jobInfoService;@Testvoid contextLoads() throws IOException {// 索引文件存储的位置 D:\indexDirectory directory= FSDirectory.open(new File("D:\\index"));// 分词器// StandardAnalyzer standardAnalyzer = new StandardAnalyzer();IKAnalyzer standardAnalyzer = new IKAnalyzer();// 索引创建配置对象IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LATEST,standardAnalyzer);// 索引创建对象IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);// 删除已有索引indexWriter.deleteAll();// 元数据查询List<JobInfo> jobInfos = jobInfoService.selectJobInfo();for (JobInfo jobInfo : jobInfos) {// 文档对象 import org.apache.lucene.document.*;Document indexableFields = new Document();// 添加元数据indexableFields.add(new StringField("id", String.valueOf(jobInfo.getId()), Field.Store.YES));indexableFields.add(new TextField("companyName", jobInfo.getCompany_name(), Field.Store.YES));indexableFields.add(new TextField("companyAddr", jobInfo.getCompany_addr(), Field.Store.YES));// 添加文档indexWriter.addDocument(indexableFields);}indexWriter.close();}@Testvoid contextLoads1() throws IOException {// 索引文件存储的位置 D:\indexDirectory directory= FSDirectory.open(new File("D:\\index"));DirectoryReader reader = DirectoryReader.open(directory);IndexSearcher indexSearcher = new IndexSearcher(reader);TermQuery termQuery = new TermQuery(new Term("companyName", "瓜子"));TopDocs search = indexSearcher.search(termQuery, 100);System.out.println(search.totalHits);ScoreDoc[] scoreDocs = search.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {int id=scoreDoc.doc;Document doc = indexSearcher.doc(id);System.out.println(doc.get("companyName"));System.out.println("========================");}}
}

Java微服务篇3——Lucene相关推荐

  1. Java微服务篇4——Elastic search

    Java微服务篇4--Elastic search 1.Elastic search安装配置 Elastic search官方:https://www.elastic.co/cn/products/e ...

  2. Java微服务篇5——Docker

    Java微服务篇5--Docker 1.虚拟化技术 虚拟化技术是一种计算机资源管理技术,是将计算机的各种实体资源,如服务器.网络.内存及存储 等,予以抽象.转换后呈现出来.虚拟化技术打破了计算机实体结 ...

  3. Java微服务篇2——SpringCloud

    Java微服务篇2--SpringCloud 1.微服务架构 1.1.单体应用架构 的⽤户量.数据量规模都⽐较⼩,项目所有的功能模块都放在一个工程中编码. 编译.打包并且部署在一个Tomcat容器中的 ...

  4. Java微服务篇1——SpringBoot

    Java微服务篇1--SpringBoot 1.什么是springboot 1.1.Spring出现的问题 Spring是Java企业版(Java Enterprise Edition,JEE,也称J ...

  5. java微服务开发(基础环境篇)

    java微服务开发(基础环境篇) 我们的目标是~~_浩瀚的宇宙 _~~全栈开发 俗话说的好 _工欲善其事 必先利其器 _对于一个开发者来说 一个好的开发环境可以带来的收益是巨大的 本篇的重点主要是li ...

  6. 《Java 后端面试经》微服务篇

    <Java 后端面试经>专栏文章索引: <Java 后端面试经>Java 基础篇 <Java 后端面试经>Java EE 篇 <Java 后端面试经>数 ...

  7. Java微服务——SpringCloud实战篇2:整合Gateway、Config、Bus

    Java微服务--SpringCloud实战篇2:整合Gateway.Config.Bus 如果小伙伴在阅读下列内容时,对于编写SpringCloud项目是零基础,那么请先阅读小编的另一篇博文:&qu ...

  8. 一文看懂Java微服务架构,WEB2.0,垂直架构,分布式架构,微服务架构

    Java微服务架构 目录: 了解开发环境&生成环境 WEB1.0 & WEB2.0 垂直架构 分布式架构 微服务架构 1.了解开发环境&生产环境 1.1 开发环境 平时在写代码 ...

  9. java微服务,微在哪_Java:ChronicleMap第3部分,快速微服务

    java微服务,微在哪 标准Java Maps需要在启动时进行初始化. 了解如何利用可从文件初始化的ChronicleMaps并显着减少微服务启动时间,以及如何在JVM之间共享Maps. 内置的Map ...

最新文章

  1. python高级数据结构_Python高级数据结构(二)
  2. 前端开发需要了解的JS插件
  3. android camera(三):camera V4L2 FIMC
  4. springboot设置运行内存_Docker 如何运行多个 Springboot?
  5. Cisco 交换机配置文件存放位置及管理要点
  6. windows进程管理问题
  7. VMware windows2003系统安装教程
  8. 在Python27中运行pip install dlib装载库dlib所引起的问题解决
  9. Burp suite - Burp Clickbandit
  10. Flag:通过盲文+摩斯电码才能找到我
  11. 图形学笔记(四) 数学变换
  12. Redis应用项目---抢红包功能(四)
  13. getAttribute()用法
  14. 学习笔记:在Ubuntu16.04系统内安装Petalinux软件(包括如何安装Ubuntu16.04和相关支持库 详解)
  15. 安全L1-1.2 信息安全概述-协议层脆弱性分析01-物理层及链路层
  16. PADS简介及使用流程
  17. Windows server 2012r2安装Framework3.5
  18. 《Unix编程艺术》 八九章读书笔记
  19. ZooKeeper是按照CP原则构建的,不适合做Service服务发现
  20. LTE网络中SIB2(系统消息2)信息详解

热门文章

  1. [转载] 详解Java中静态方法
  2. Java BigInteger类| toByteArray()方法与示例
  3. iti axi dsp_ITI的完整形式是什么?
  4. java bitset_Java BitSet nextSetBit()方法与示例
  5. 程序设计爬楼梯问题_楼梯案例:解决楼梯问题的C ++程序
  6. 不知道Mysql排序的特性,加班到12点,认了认了!
  7. C# Winform 窗体美化(目录)
  8. SpringBoot执行器端点Actuator Endpoint
  9. python代码性能分析_Python 性能分析入门指南
  10. sensei鼠标测试软件,'黑科技'传感器打造出的FPS利器 - 赛睿Sensei 310 鼠标