Java微服务篇3——Lucene

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)字符串NYY/N字符串类型Field, 不分词, 作为一个整体进行索引(如: 身份证号, 订单编号), 是否需要存储由Store.YES或Store.NO决定
StoredField(FieldName, FieldValue)重载方法, 支持多种类型NNY构建不同类型的Field, 不分词, 不索引, 要存储. (如: 商品图片路径)
TextField(FieldName, FieldValue, Store.NO)文本类型YYY/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("========================");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器中所有文件夹变只读,我的电脑里全部文件夹属性都变成只读了改也改不过来...

第一个方法&#xff1a;你用管理员身份进入电脑然后更改一下文件夹的属性.隐藏文件看不到可以通过下面的方法显示出来:在文件夹选项里去掉‘隐藏受保护的文件和文件夹’前面的勾选--应用--确定 试试能否显示出你所需要的文件如果还不能显示&#xff0c;那么应该是注册表的问题&…

Java微服务篇4——Elastic search

Java微服务篇4——Elastic search 1、Elastic search安装配置 Elastic search官方&#xff1a;https://www.elastic.co/cn/products/elasticsearch Elastic search6.2.4 百度云&#xff1a;https://pan.baidu.com/s/1JyQok8Nija4gYhcjh-HWcw提取码&#xff1a;isa2 解压即可…

ftp文件服务器杀毒,FTP远程查杀网页木马方法

感谢使用护卫神云查杀系统&#xff0c;该软件专门查杀网页木马&#xff0c;完全免费&#xff0c;欢迎大家使用。远程FTP查杀部分&#xff1a;1、点击【远程查杀】图标&#xff0c;如上图所示&#xff0c;进入远程FTP查杀页面&#xff1a;1、首先要求输入远程FTP连接信息&#x…

Java微服务篇5——Docker

Java微服务篇5——Docker 1、虚拟化技术 虚拟化技术是一种计算机资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储 等&#xff0c;予以抽象、转换后呈现出来。虚拟化技术打破了计算机实体结构间的&#xff0c;不可切割的障碍。使用户…

文件服务器 说明,文件服务器搭建说明.pdf

文件共享服务器搭建 责任人 姜 源 起讫时间 2010 11 15 至 2010 12 19 编号 JY001 0 目录目录 一 确定实现方案 1 二 方案实现方法 4 三 参考资料 12 1 文件服务器搭建说明与经验总结文件服务器搭建说明与经验总结 一 一 确定实现方案确定实现方案 方案方案 A Windows Server E…

Shiro 实战教程

Shiro 实战教程 1.权限的管理 1.1 什么是权限管理 ​ 基本上涉及到用户参与的系统都要进行权限管理&#xff0c;权限管理属于系统安全的范畴&#xff0c;权限管理实现对用户访问系统的控制&#xff0c;按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源…

货车定位服务器维护是什么意思,有关货车日常维护的主要内容

有关货车日常维护的主要内容货车日常维护的主要内容1)汽车日常维护以清洗、补给和检查为主要内容&#xff0c;如图1-47所示。2)行车前的检查有驾驶室内检查、发动机舱检查、车辆外部检查和轮胎检查。3)行车前发动机舱的检查包括玻璃清洗液、机油、冷却液、蓄电池液、制动液和风…

MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况

MySQL的INSERT ON DUPLICATE KEY UPDATE使用的几种情况 在MySQL数据库中&#xff0c;如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句&#xff0c;而要插入的行与表中现有记录的惟一索引或主键中产生重复值&#xff0c;那么就会发生旧行的更新&#xff1b;如果插入的行…

mybatis笔记之一次插入多条数据sql语句写法

mybatis笔记之一次插入多条数据sql语句写法

Idea插件——Translation 翻译插件安装与使用

Translation 安装 实现步骤如下: file——setting——plugin——marketplace——输入Translation——点击install——安装完成点击apply应用—ok确认——重启idea才能生效 Translation 使用 选中单词或者段落ctrlshifty翻译&#xff0c;ctrlshifts切换翻译源 ctrlshifty翻译…

INSERT IGNORE 与INSERT INTO的区别

INSERT IGNORE 与INSERT INTO的区别 INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据&#xff0c;如果数据库没有数据&#xff0c;就插入新的数据&#xff0c;如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据&#xff0…

java中Date日期类型的大小比较

java中Date日期类型的大小比较 方法一: java.util.Date类实现了Comparable接口&#xff0c;可以直接调用Date的compareTo()方法来比较大小 String beginTime "2018-07-28 14:42:32"; String endTime "2018-07-29 12:26:32";SimpleDateFormat format …

Java8 中 List 转 Map(Collectors.toMap) 使用技巧

Java8 中 List 转 Map(Collectors.toMap) 使用技巧 在实际项目中我们经常会用到 List 转 Map 操作&#xff0c;在过去我们可能使用的是 for 循环遍历的方式。举个例子&#xff1a; 先定义类&#xff1a; // 简单对象 Accessors(chain true) // 链式方法 lombok.Data clas…

BeautifulSoup入门案例

import beautifulsoup4 as bsimport requestsurl "http://www.baidu.com"html requests.get(url) # 获取网页响应对象html.encoding utf-8 # 修改网页响应对象&#xff08;requests.models.Response&#xff09;的编码格式content html.text # 获取网页的内容…

MySQL中concat函数(连接字符串)

MySQL中concat函数&#xff08;连接字符串&#xff09; MySQL中concat函数 使用方法&#xff1a; concat(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL &#xff0c;则返回值为 NULL。 mysql> select concat(‘11’,‘22’,‘33’); ---------…

复制Linux虚拟机后的网卡问题解决

以CentOS为例&#xff1a; 首先修改&#xff1a; /etc/sysconfig/network-scripts/ifcfg-eth0 此文件中的DEVICEeth0要与文件名中的网卡名一致&#xff0c;并且此文件中的网卡的HWADDR要与下面文件中对应的网卡的HWADDR一致 再修改&#xff1a; /etc/udev/rules.d/70-persiste…

模糊查询 LIKE CONCAT()的使用

模糊查询 LIKE CONCAT()的使用 LIKE CONCAT() 根据学生名称模糊查询学生信息 sql语句实现 select stuName from student where stuName LIKE CONCAT(’%’, ‘张’, ‘%’)mybatis实现&#xff1a; select stuName from student where stuName LIKE CONCAT (’%’,#{stuNa…

Linux中的shell正则表达式详解

Shell中使用正则表达式处理文本的命令有如下工具&#xff1a; 命令描述grep默认不支持扩展表达式&#xff0c;加-E选项开启ERE。如果不加-E&#xff0c;此时使用花括号时要加转义符&#xff1a;\{\}egrep支持基础和扩展表达式awk支持基础和扩展表达式sed默认不支持扩展表达式&…

java编码问题详解

import java.io.UnsupportedEncodingException; import java.util.Arrays;/*编码&#xff1a; 字符变成字节数组解码&#xff1a; 字节数组变成字符串String --> byte[] : str.getBytes()byte[] --> String : new String(byte[])*/public class EncodeDemo {public…

JDK1.8 新特性(全)

JDK1.8 新特性 本文主要介绍了JDK1.8版本中的一些新特性&#xff0c;乃作者视频观后笔记&#xff0c;仅供参考。 jdk1.8新特性知识点&#xff1a; Lambda表达式函数式接口方法引用和构造器调用Stream API接口中的默认方法和静态方法新时间日期API 在jdk1.8中对hashMap等map集…