B081-Lucene+ElasticSearch

目录

      • 认识全文检索
        • 概念
        • lucene原理
        • 全文检索的特点
        • 常见的全文检索方案
      • Lucene
        • 创建索引
          • 导包
          • 分析图
          • 代码
        • 搜索索引
          • 分析图
          • 代码
      • ElasticSearch
        • 认识ElasticSearch
        • ES与Kibana的安装及使用说明
        • ES相关概念理解和简单增删改查
        • ES查询
          • DSL查询
          • DSL过滤
        • 分词器
          • IK分词器
            • 安装
            • 测试分词器
          • 文档映射(字段类型设置)
            • ES字段类型
            • 默认映射
            • kibana
        • Java操作ES
          • 导入依赖
          • crud实现

认识全文检索

概念

对非结构化数据的搜索就叫全文检索,狭义的理解主要针对文本数据的搜索。

非结构化数据:
没有固定模式的数据,如WORD、PDF、PPT、EXL,各种格式的图片、视频等。
非结构化数据是数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据。包括所有格式的办公文档、文本、图片、XML, HTML、各类报表、图像和音频/视频信息等等

理解:可以理解为全文检索就是把没有结构化的数据变成有结构的数据,然后进行搜索,因为有结构化的数据通常情况下可以按照某种算法进行搜索。

lucene原理

在这里插入图片描述
在这里插入图片描述

全文检索的特点

相关度最高的排在最前面,官网中相关的网页排在最前面; java
关键词的高亮。
只处理文本,不处理语义。 以单词方式进行搜索
比如在输入框中输入“中国的首都在哪里”,搜索引擎不会以对话的形式告诉你“在北京”,而仅仅是列出包含了搜索关键字的网页。

常见的全文检索方案

全文搜索工具包-Lucene(核心)
全文搜索服务器 ,Elastic Search(ES) / Solr等封装了lucene并扩展

Lucene

创建索引

导包
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>5.5.0</version>
</dependency>
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId><version>5.5.0</version>
</dependency>
<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId><version>5.5.0</version>
</dependency>
分析图

在这里插入图片描述

代码
    //创建索引@Testpublic void testCreateIndex() throws Exception {// 准备原始数据String doc1 = "hello world";int id1 = 1;String doc2 = "hello java world";int id2 = 2;String doc3 = "lucene world";int id3 = 3;//把数据变成Document对象Document d1 = new Document();d1.add(new TextField("context",doc1, Field.Store.YES));// 存储列的名字;存储的数据;是否要存储原始数据d1.add(new IntField("id", id1, Field.Store.YES));Document d2 = new Document();d2.add(new TextField("context",doc2, Field.Store.YES));d2.add(new IntField("id", id2, Field.Store.YES));Document d3 = new Document();d3.add(new TextField("context",doc3, Field.Store.YES));d3.add(new IntField("id", id3, Field.Store.YES));//准备索引库路径Directory directory = new SimpleFSDirectory(Paths.get("D:/(课件 Xmind 图 代码) (总结) (原理)(题目) (预习)/081-Lucene+ElasticSearch/code/lucene-demo/index"));Analyzer analyzer = new SimpleAnalyzer();//配置信息,添加分词器IndexWriterConfig conf = new IndexWriterConfig(analyzer);//创建IndexWriter,创建索引IndexWriter indexWriter = new IndexWriter(directory,conf);//使用IndexWriter创建索引indexWriter.addDocument(d1);indexWriter.addDocument(d2);indexWriter.addDocument(d3);//提交创建indexWriter.commit();indexWriter.close();System.out.println("创建索引完成.......");}

搜索索引

分析图

在这里插入图片描述

代码
    //搜索索引@Testpublic void testSearchIndex() throws Exception {//索引库路径Directory directory = new SimpleFSDirectory(Paths.get("D:/(课件 Xmind 图 代码) (总结) (原理)(题目) (预习)/081-Lucene+ElasticSearch/code/lucene-demo/index"));IndexReader indexReader = DirectoryReader.open(directory);//创建indexSearch 搜索索引IndexSearcher indexSearcher = new IndexSearcher(indexReader);//Term(String fld, String text) 要查询哪个字段,查询什么内容TermQuery query = new TermQuery(new Term("context", "hello"));//query:查询的条件   n:查多少条TopDocs topDocs = indexSearcher.search(query, 10);System.out.println("命中的条数:"+topDocs.totalHits);//列表结果,带有分数ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {//文档分数float score = scoreDoc.score;//文档idint docID = scoreDoc.doc;//根据id获取文档Document doc = indexSearcher.doc(docID);System.out.println("id = "+doc.get("id")+" , score = "+score+" ,context = "+doc.get("context"));}}

ElasticSearch

认识ElasticSearch

见文档

ES与Kibana的安装及使用说明

见文档
Kibana可视化管理工具,相当于navicat,

ES相关概念理解和简单增删改查

在这里插入图片描述

#  添加数据       ---用户自己维护文档id
PUT pethome/user/5
{"id":5, "name": "wenda", "age":20,"size":170, "sex":1
}#  添加数据       ---ES自动维护文档id AYpOuIdMNmSVfcreiYqz
POST pethome/user/
{"id":2, "name": "wenda", "age":20,"size":170, "sex":1
}# 查询单条
GET pethome/user/1
GET pethome/user/AYpOuIdMNmSVfcreiYqz# 修改 全量修改
PUT pethome/user/1
{"id":1, "name": "wendaxi", "age":21,"sex":0
}# 修改  局部
POST pethome/user/1/_update
{"doc":{"name": "wenda", "age":24}
}#  删除
DELETE pethome/user/AYpOuIdMNmSVfcreiYqz#  获取多个数据结果
GET pethome/user/_mget
{"ids":[1,"AYpOuIdMNmSVfcreiYqz"]
}#  空搜索
GET _search#  分页
GET pethome/user/_search?size=2&from=2#  带条件分页
GET pethome/user/_search?q=age:20&size=2&from=2

ES查询

DSL查询

由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现

# 查询名字叫做wenda,size在160-180之间,sex为1,
# 按照id升序排序 查询第一页 的数据 每页3条# 排序分页
GET pethome/user/_search
{"size": 3,"from": 0,"sort": [{"id": {"order": "asc"}}]
}#  加入查询条件
#  match 相当于模糊查询(分词查询)
GET pethome/user/_search
{"query": {"match": {"name": "wenda"}}, "size": 3,"from": 0,"sort": [{"id": {"order": "asc"}}]
}
DSL过滤

DSL过滤 查询文档的方式更像是对于我的条件“有”或者“没有”,–精确查询
而DSL查询语句则像是“有多像”。–类似于模糊查询

DSL过滤和DSL查询在性能上的区别 :
过滤结果可以缓存并应用到后续请求。
查询语句同时 匹配文档,计算相关性,所以更耗时,且不缓存。
过滤语句 可有效地配合查询语句完成文档过滤。

# 工作中少用like全表扫描,会让索引失效
# where name like '%y%' and age=18 
# where age=18 and name like "%y%" (快)
# 先精确匹配 把结果缓存用于后续的查询
# DSL过滤-------相当于精确查找
GET pethome/user/_search
{"query": {"bool": {"must": [{"match": {"name": "wenda"}}],"filter": [{"term": {"age": "20"}},{"range": {"size": {"gte": 160,"lte": 170}}}]}}, "size": 2,"from": 0,"sort": [{"id": {"order": "asc"}}]
}

分词器

单字,双字,庖丁,IK

IK分词器
安装

先关闭ES与Kibana,然后解压elasticsearch-analysis-ik-5.2.2.zip文件,并将其内容放置于ES根目录/plugins/ik

测试分词器
POST _analyze
{"analyzer":"ik_smart","text":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
}
文档映射(字段类型设置)

ES的文档映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。

ES字段类型
① 基本字段类型
字符串:text(分词),keyword(不分词)   StringField(不分词文本),TextFiled(要分词文本)text默认为全文文本,keyword默认为非全文文本
数字:long,integer,short,double,float
日期:date
逻辑:boolean
{user:{“key”:value}}
{hobbys:[xxx,xx]}
② 复杂数据类型
对象类型:object
数组类型:array
地理位置:geo_point,geo_shape
默认映射

查看索引类型的映射配置:GET {indexName}/_mapping/{typeName}
ES在没有配置Mapping的情况下新增文档,ES会尝试对字段类型进行猜测,并动态生成字段和类型的映射关系。
在这里插入图片描述

kibana
GET pethome/user/_mappingPOST pethome/employee2/_mapping
{"employee2": {"properties": {"id": {"type": "long"},"username": {"type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart"},"password": {"type": "keyword"}}}
}GET pethome/employee2/_mapping

Java操作ES

导入依赖
	<dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.2.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.7</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.7</version></dependency>
crud实现
import org.elasticsearch.action.delete.DeleteRequestBuilder;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequestBuilder;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;public class ESTestNew {//创建ES的客户端对象public static TransportClient getClient(){TransportClient client = null;try {client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));} catch (UnknownHostException e) {e.printStackTrace();}return client;}@Testpublic void testAddIndex(){TransportClient client = getClient();for (int i = 0; i < 50; i++) {IndexRequestBuilder builder = client.prepareIndex("pethome", "wxuser", String.valueOf(i));Map<String, Object> map = new HashMap<>();// 添加数据map.put("id",i);map.put("name","玛利亚"+i);map.put("age",18+i);map.put("sex",i%2);map.put("size",150+i);map.put("intro","haha"+i);builder.setSource(map);// 执行创建builder.get();}// 关闭资源client.close();}@Testpublic void testUpdate(){TransportClient client = getClient();// 指定要执行的操作对象UpdateRequestBuilder builder = client.prepareUpdate("pethome", "wxuser", String.valueOf(0));Map<String, Object> map = new HashMap<>();map.put("id",0);map.put("name","玛利亚000");map.put("age",18);map.put("sex",0);map.put("size",155);map.put("intro","haha000");builder.setDoc(map).get();client.close();}@Testpublic void testDel(){TransportClient client = getClient();DeleteRequestBuilder builder = client.prepareDelete("pethome", "wxuser", String.valueOf(0));builder.get();client.close();}@Testpublic void testQuery(){TransportClient client = getClient();SearchRequestBuilder builder = client.prepareSearch("pethome");builder.setTypes("wxuser");// 指定查询那个文件类型builder.setFrom(0);//起始位置builder.setSize(5);//每页条数builder.addSort("id", SortOrder.ASC);//设置排序// 添加筛选条件BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.matchQuery("name","玛利亚"));boolQuery.filter(QueryBuilders.termQuery("sex",1));boolQuery.filter(QueryBuilders.rangeQuery("size").gte(150).lte(180));SearchResponse response = builder.setQuery(boolQuery).get();SearchHits hits = response.getHits();System.out.println(hits.getTotalHits());SearchHit[] searchHits = hits.getHits();for (SearchHit searchHit : searchHits) {System.out.println(searchHit.getSource());}client.close();}
}

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

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

相关文章

使用ELK收集解析nginx日志和kibana可视化仪表盘

文章目录 ELK生产环境配置filebeat 配置logstash 配置 kibana仪表盘配置配置nginx转发ES和kibanaELK设置账号和密码 ELK生产环境配置 ELK收集nginx日志有多种方案&#xff0c;一般比较常见的做法是在生产环境服务器搭建filebeat 收集nginx的文件日志并写入到队列&#xff08;k…

uniapp - 倒计时组件-优化循环时间倒计时

使用定时器的规避方法 为了避免定时器误差导致倒计时计算错误&#xff0c;可以采用一些规避方法&#xff0c;比如将倒计时被中断时的剩余时间记录下来&#xff0c;重新开启定时器时再将这个剩余时间加到新的计算中。同时&#xff0c;为了避免定时器延迟&#xff0c;可以在每次执…

Python数据分析实战-Series转DataFrame并将index设为新的一列(附源码和实现效果)

实现功能 Series转DataFrame并将index设为新的一列 实现代码 import pandas as pd# 创创建series series pd.Series([1, 2, 3, 4, 5])# 创建一个DataFrame对象 data {column_name: series} df pd.DataFrame(data)# 重新设置索引&#xff0c;将原有的索引作为新的一列 df.r…

GIT实战篇,教你如何使用GIT可视化工具

系列文章目录 手把手教你安装Git&#xff0c;萌新迈向专业的必备一步 GIT命令只会抄却不理解&#xff1f;看完原理才能事半功倍&#xff01; 快速上手GIT命令&#xff0c;现学也能登堂入室 GIT实战篇&#xff0c;教你如何使用GIT可视化工具 系列文章目录一、GIT有哪些常用工具…

2023高教社杯数学建模A题B题C题D题E题思路模型 国赛建模思路分享

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

如何截取视频中的一段视频?分享几种视频分割方法

当处理长视频时&#xff0c;视频分割可以使您更加高效。如果您只需要处理其中的一部分&#xff0c;而不是整个视频&#xff0c;那么分割视频可以使您更容易找到需要处理的部分。而且&#xff0c;分割视频还可以使您更容易在不同的项目之间重复使用视频片段。教大家几种简单的视…

基于Python的IOS自动化测试环境搭建

文章目录 一、测试架构介绍1.1 WebDriverAgent原理分析1.2 tidevice原理分析二、环境安装2.1 iOS 设备安装 WebDriverAgent2.2 安装iTunes2.3 安装tidevice2.4 安装facebook-wda自动化三、操作流程四、Weditor的安装和使用一、测试架构介绍 以下为测试架构原理图 手机端的WDA…

【vue2第十二章】ref和$refs获取dom元素 和 vue异步更新与$nextTick使用

ref和$refs获取dom元素 为什么会有 ref 和 $refs&#xff1f; 因为在vue页面中使用dom查找元素&#xff0c;不管你是不是在子组件里面查找&#xff0c;查找的都是整个页面的元素&#xff0c;如果你想查找单独组件里面的元素是不容易实现的&#xff0c;除非把每个组件的class写…

【Java转Go】Go中使用WebSocket实现聊天室(私聊+群聊)

目录 前言功能效果&#xff08;一人分饰多角.jpg&#x1f60e;&#xff09;用户上线、群聊私聊和留言下线 实现思路代码服务端 chat.go 完整代码客户端 html 完整代码 最后 前言 之前在Java中&#xff0c;用 springbootwebsocket 实现了一个聊天室&#xff1a;springbootwebso…

【广州华锐互动】利用AR远程指导系统进行机械故障排查,实现远程虚拟信息互动

随着工业自动化和智能化的不断发展&#xff0c;机械故障诊断已经成为了工业生产中的重要环节。为了提高故障诊断的准确性和效率&#xff0c;近年来&#xff0c;AR&#xff08;增强现实&#xff09;远程协助技术逐渐应用于机械故障诊断领域。本文将探讨AR远程协助技术在机械故障…

华为数通方向HCIP-DataCom H12-821题库(单选题:201-220)

第201题 BGP 协议用​​ beer default-route-advertise​​ 命令来给邻居发布缺省路由,那么以下关于本地 BGP 路由表变化的描述&#xff0c;正确的是哪一项? A、在本地 BGP 路由表中生成一条活跃的缺省路由并下发给路由表 B、在本地 BGP 路由表中生成一条不活跃的缺省路由&…

应用于伺服电机控制、 编码器仿真、 电动助力转向、发电机、 汽车运动检测与控制的旋变数字转换器MS5905P

MS5905P 是一款 12bit 分辨率的旋变数字转换器。 片上集成正弦波激励电路&#xff0c;正弦和余弦允许输入峰峰值 幅度为 2.3V 到 4.0V &#xff0c;可编程激励频率为 10kHz 、 12kHz 、 15kHz 、 20kHz 。 转换器可并行或串行输出角度 和速度对应的数字量。 MS5905…

动态贴纸、美颜SDK与AR:创造独特的互动体验

目前&#xff0c;动态贴纸、美颜SDK、增强现实&#xff08;AR&#xff09;等技术是比较热门的话题&#xff0c;它们所结合的新兴玩法更是收到大家推崇&#xff0c;正潜移默化的改变我们与数字世界互动的方式。 一、动态贴纸&#xff1a;个性化互动的开始 动态贴纸&#xff0c…

JVM-CMS

when 堆大小要求为4-8G 原理 初始标记&#xff1a;执行CMS线程->STW&#xff0c;标记GC Root直接关联的对象->低延迟 并发标记&#xff1a;执行CMS线程和业务线程&#xff0c;从GC Root直接关联的对象开始遍历整个对象图 重新标记&#xff1a;执行CMS线程->STW&a…

大数据时代下的数据安全防护

随着大数据时代的来临&#xff0c;数据安全防护成为了一个重要的问题。在大数据时代&#xff0c;数据的规模和价值都得到了极大的提升&#xff0c;因此数据安全的重要性也变得越来越突出。本文将从数据加密、访问控制、网络安全和人员管理四个方面来介绍大数据时代下的数据安全…

CVE-2023-23752:Joomla未授权访问漏洞复现

CVE-2023-23752&#xff1a;Joomla未授权访问漏洞复现 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本文作者无关&#xff0c;需自行负责&#xff01;&#xff01;&#xff01; 一.Openfire简介 Joomla是一个免费的开源内容管理系统&#xff08;CMS&a…

Unity中Shader的UV扭曲效果的实现

文章目录 前言一、实现的思路1、在属性面板暴露一个 扭曲贴图的属性2、在片元结构体中&#xff0c;新增一个float2类型的变量&#xff0c;用于独立存储将用于扭曲的纹理的信息3、在顶点着色器中&#xff0c;根据需要使用TRANSFORM_TEX对Tilling 和 Offset 插值&#xff1b;以及…

群晖NAS:DS Video、Jellyfin等视频电影电视剧海报、背景墙搜刮器

群晖NAS&#xff1a;DS Video、Jellyfin等视频电影电视剧海报、背景墙搜刮器 本文只使用豆瓣插件方式&#xff0c;系统默认的 The Movie Database 好注册&#xff0c;但是授权码输入后域名不通过&#xff0c;很麻烦。 1、插件地址&#xff1a; https://www.aliyundrive.com/s…

WebRTC音视频通话-WebRTC推拉流过程中日志log输出

WebRTC音视频通话-WebRTC推拉流过程中日志log输出 之前实现iOS端调用ossrs服务实现推拉流流程。 推流&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132262724 拉流&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132417602 在推拉流过程中的…

【java】解决sprintboot项目开发遇到的问题

目录 一、java: 程序包org.junit.jupiter.api不存在 二、Cannot resolve com.mysql:mysql-connector-j:unknown 三、Unsatisfied dependency expressed through bean property sqlSessionFactory; nested exception is org.springframework 四、org.apache.ibatis.binding…