Elasticsearch 应用

Elasticsearch 的应用

本文使用的版本为:7.14.0
todo:前端部分

Kibana的开发工具

IK分词器粗粒度

# 请求,通过【ik_smart】最粗粒度划分
GET _analyze
{"analyzer": "ik_smart","text":"中国共产党"
}# 返回
{"tokens" : [{"token" : "中国共产党","start_offset" : 0,"end_offset" : 5,"type" : "CN_WORD","position" : 0}]
}

IK分词器细粒度

# 请求,通过【ik_max_word】最细粒度划分
GET _analyze
{"analyzer": "ik_max_word","text":"中国共产党"
}# 返回
{"tokens" : [{"token" : "中国共产党","start_offset" : 0,"end_offset" : 5,"type" : "CN_WORD","position" : 0},{"token" : "中国","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 1},{"token" : "国共","start_offset" : 1,"end_offset" : 3,"type" : "CN_WORD","position" : 2},{"token" : "共产党","start_offset" : 2,"end_offset" : 5,"type" : "CN_WORD","position" : 3},{"token" : "共产","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 4},{"token" : "党","start_offset" : 4,"end_offset" : 5,"type" : "CN_CHAR","position" : 5}]
}

Rest风格说明

methodurl地址描述
PUTlocalhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)
POSTlocalhost:9200/索引名称/类型名称创建文档(随机文档id)
POSTlocalhost:9200/索引名称/类型名称/文档id/_update修改文档
DELETElocalhost:9200/索引名称/类型名称/文档id删除文档
GETlocalhost:9200/索引名称/类型名称/文档id查询文档通过文档id
POSTlocalhost:9200/索引名称/类型名称/_search查询所有数据

关于索引的基本操作

# 创建索引并添加数据 反复提交则为覆盖修改
PUT bu/_doc/1
{"name":"张三","age":"12"
}# 返回值
{"_index" : "bu","_type" : "_doc","_id" : "2","_version" : 1,		# 当多次提交后,版本信息则会随之改变"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 6,"_primary_term" : 1
}
# 创建索引规则
PUT /test1/
{"mappings": {"properties": {"name": {"type": "text"},"age": {"type": "long"},"birthday": {"type": "date"}}}
}# 返回值
{"acknowledged" : true,"shards_acknowledged" : true,"index" : "test1"
}
# 查询
GET /bu/# 返回值
{"bu" : {"aliases" : { },"mappings" : {"properties" : {"age" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"name" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}},"settings" : {"index" : {"routing" : {"allocation" : {"include" : {"_tier_preference" : "data_content"}}},"number_of_shards" : "1","provided_name" : "bu","creation_date" : "1700188636398","number_of_replicas" : "1","uuid" : "m-y5rTaqRQSyKr-a_sAdXw","version" : {"created" : "7140099"}}}}
}
# 通过_cat 获取ES更多信息
GET _cat/indices?v			# 索引
GET _cat/aliases			# 别名
GET _cat/allocation
GET _cat/count
GET _cat/fielddata
GET _cat/health
GET _cat/master
GET _cat/nodeattrs
GET _cat/nodes				# 查看节点信息,docker容器即为容器信息
GET _cat/pending_tasks
GET _cat/plugins			# 查看插件,如ik分词器
GET _cat/recovery
GET _cat/repositories
GET _cat/segments
GET _cat/shards
GET _cat/snapshots
GET _cat/tasks
GET _cat/templates
GET _cat/thread_pool
# 通过Post方法进行修改	【如果漏写字段,也不会把字段删除】
POST /test/_update/1/
{"doc":{"name":"李四"}
}// 结果
{"_index" : "test","_type" : "_doc","_id" : "1","_version" : 2,"result" : "noop","_shards" : {"total" : 0,"successful" : 0,"failed" : 0},"_seq_no" : 1,"_primary_term" : 1
}
# 删除索引
DELETE test

关于文档的基本操作

# 通过条件查询
GET /test/user/_search?q=name:张三# 通过条件查询
GET /test/user/_search
{"query":{"match": {"name": "张三"}}
}# 返回值
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {				#  hits: 命中"total" : {"value" : 2,"relation" : "eq"},"max_score" : 0.36464313,"hits" : [{"_index" : "test","_type" : "user","_id" : "1","_score" : 0.36464313,"_source" : {"name" : "张三","age" : 10,"desc" : "说明","tags" : ["1","2","3"]}},{"_index" : "test","_type" : "user","_id" : "2","_score" : 0.36464313,"_source" : {"name" : "张三","age" : 10,"desc" : "说明","tags" : ["1","2","3"]}}]}
}
# 过滤要查询的结果 【select name】
GET /test/_search
{"query":{"match": {"name": "张三"}}, "_source": ["name"]		# 只显示name
}# 返回结果
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 0.36464313,"hits" : [{"_index" : "test","_type" : "user","_id" : "1","_score" : 0.36464313,"_source" : {"name" : "张三"}},{"_index" : "test","_type" : "user","_id" : "2","_score" : 0.36464313,"_source" : {"name" : "张三"}}]}
}
# 排序
GET /test/_search
{"query":{"match": {"name": "张三"}}, "sort": [{"age": {"order": "desc"}}]
}
# 分页
GET /test/_search
{"query":{"match": {"name": "张三"}}, "sort": [{"age": {"order": "desc"}}], "from": 0, "size": 1
}
# 查询 name 必须【must】 是张三的
GET /test/user/_search
{"query":{"bool": {"must": [{"match": {"name": "张三"}}]}}
}# 查询 name 不能【must_not】 是张三的
GET /test/user/_search
{"query":{"bool": {"must_not": [{"match": {"name": "张三"}}]}}
}# 查询 name=张三 or age=10GET /test/user/_search
{"query":{"bool": {"should": [{"match": {"name": "张三"}},{"match": {"age": "10"}}]}}
}# 查询 范围数据
"gt": 大于
"gte": 大于等于
"lt": 小于
"lte": 小于等于GET /test/user/_search
{"query":{"bool": {"filter": [{"range": {"age": {"gte": 3,"lte": 10}}}]}}
}
# 通过 标签查询,多个值用空格分隔
GET /test/user/_search
{"query":{"match": {"tags": "1 2"}}
}

term 查询是直接通过倒排索引指定的词条进程精确的查找

关于分词

  • term 直接精确查询
  • match 会使用分词器解析!!(先分析文档,然后通过分析的文档进行查询!!)

两个类型 text keyword

  • text 可分
  • keyword 不可再分
# 创建测试数据
PUT testdb
{"mappings": {"properties": {"name":{"type": "text"  },"desc":{"type": "keyword"}}}
}PUT testdb/_doc/1
{"name":"测试","desc":""
}GET /testdb/_doc/1
# 通过keyword【关键字】进行分析 分析结果:测试
GET _analyze
{"analyzer": "keyword","text": "测试"
}# 通过standard【标准】进行分析 分析结果:测 试
GET _analyze
{"analyzer": "standard", "text": "测试"
}
# 通过term查询
GET testdb/_search
{"query": {"term": {"desc": {"value": ""}}}
}GET testdb/_search
{"query": {"term": {"name": {"value": "测"}}}
}
# 实现高亮查询
GET /test/user/_search
{"query":{"bool": {"should": [{"match": {"name": "张三"}},{"match": {"age": "10"}}]}},"highlight":{"pre_tags": "<span class='key' style='color:red'>", "post_tags": "</span>", "fields": {"name": {}}}
}# 结果
"_source" : {"name" : "张三","age" : 10,"desc" : "说明","tags" : ["1","2","3"]
},
"highlight" : {"name" : ["<span class='key' style='color:red'>张</span><span class='key' style='color:red'>三</span>"]
}

整合SpringBoot

ES 依赖版本

# 注意 ES 的依赖版本,需要与服务的版本保持一致
<properties><java.version>1.8</java.version><!-- 自定义版本,版本依赖需要保证和本地一致 --><elasticsearch.version>7.14.0</elasticsearch.version>
</properties>

爬取数据存入ES

# 第一步配置依赖
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version>
</dependency>
# 第二步编写方法public static List<Context> getGoodsList(String keyword) throws IOException {String url = "https://search.jd.com/Search?keyword=wd&enc=utf-8";Document document = Jsoup.parse(new URL(url.replace("wd", keyword)), 3000);Element j_goodsList = document.getElementById("J_goodsList");Elements li = j_goodsList.getElementsByTag("li");List<Context> goodsList = new ArrayList<>();for (Element e:li) {String img = e.getElementsByTag("img").eq(0).attr("data-lazy-img");String price = e.getElementsByClass("p-price").eq(0).text();String title = e.getElementsByClass("p-name").eq(0).text();goodsList.add(new Context(img,price,title));}return goodsList;}

ES Client配置类

package com.es.elasticsearch.config;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ElasticSearchClientConfig {@Beanpublic RestHighLevelClient restHighLevelClient(){return new RestHighLevelClient(RestClient.builder(new HttpHost("8.140.248.231", 9200, "http")));}
}

业务实现类

package com.es.elasticsearch.service;import com.alibaba.fastjson.JSON;
import com.es.elasticsearch.pojo.Context;
import com.es.elasticsearch.pojo.User;
import com.es.elasticsearch.util.HtmlParseUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.core.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;@Service
public class ContextService {@Autowired@Qualifier("restHighLevelClient")private RestHighLevelClient restHighLevelClient;// 1. 调用工具类,将预备的解析数据插入到索引public Boolean insert(String keyword) throws IOException {String index = "jd";GetIndexRequest getIndexRequest = new GetIndexRequest(index);boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);if(!exists){// 如果不存在则创建CreateIndexRequest createIndexRequest = new CreateIndexRequest(index);restHighLevelClient.indices().create(createIndexRequest,RequestOptions.DEFAULT);}List<Context> goodsList = HtmlParseUtil.getGoodsList(keyword);BulkRequest BulkRequest = new BulkRequest();BulkRequest.timeout("30s");for(Context context:goodsList){BulkRequest.add(new IndexRequest(index).source(JSON.toJSONString(context), XContentType.JSON));}BulkResponse bulkResponse = restHighLevelClient.bulk(BulkRequest, RequestOptions.DEFAULT);// 是否失败return !bulkResponse.hasFailures();}// 3. 获取这些数据,实现高亮的搜索功能public List<Map<String,Object>> searchPagehighLight(String keyword, int pageNo,int pageSize) throws IOException {if (pageNo <= 1)pageNo = 1;// 条件清晰SearchRequest searchRequest = new SearchRequest("jd");SearchSourceBuilder builder = new SearchSourceBuilder();builder.from(pageNo);builder.size(pageSize);// 精准匹配TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",keyword);builder.query(termQueryBuilder);builder.timeout(new TimeValue(60, TimeUnit.SECONDS));// 高亮HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("title");highlightBuilder.requireFieldMatch(false);highlightBuilder.preTags("<span style='color:red'>");highlightBuilder.postTags("</span>");builder.highlighter(highlightBuilder);// 执行搜索searchRequest.source(builder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 解析结果ArrayList<Map<String,Object>> list= new ArrayList<>();for (SearchHit hit: searchResponse.getHits().getHits()) {// 解析高亮的字段Map<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField title = highlightFields.get("title");Map<String,Object> sourceAsMap = hit.getSourceAsMap();// 原来的结果// 解析高亮字段,将原来的字段换成我们高亮的字段即可if (title != null) {Text[] fragments = title.fragments();StringBuilder nTitle = new StringBuilder();for (Text text:fragments) {nTitle.append(text);}sourceAsMap.put("title",nTitle);}list.add(hit.getSourceAsMap()); // 高亮的字段替换为原来的内容即可}return list;}// 2. 获取这些数据,实现基本的搜索功能public List<Map<String,Object>> searchPage (String keyword, int pageNo,int pageSize) throws IOException {if (pageNo <= 1)pageNo = 1;// 条件清晰SearchRequest searchRequest = new SearchRequest("jd");SearchSourceBuilder builder = new SearchSourceBuilder();builder.from(pageNo);builder.size(pageSize);// 精准匹配TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",keyword);builder.query(termQueryBuilder);builder.timeout(new TimeValue(60, TimeUnit.SECONDS));// 执行搜索searchRequest.source(builder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 解析结果ArrayList<Map<String,Object>> list= new ArrayList<>();for (SearchHit hit: searchResponse.getHits().getHits()) {list.add(hit.getSourceAsMap()); // 高亮的字段替换为原来的内容即可}return list;}
}

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

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

相关文章

Linux:进程替换和知识整合

文章目录 进程程序替换替换原理进程替换的理解 环境变量与进程替换命令行解释器实现逻辑 进程程序替换 前面已经学习了子进程的创建&#xff0c;但是子进程的创建不管怎么说&#xff0c;都是父进程代码的一部分&#xff0c;那么实际上如果想要子进程执行新的程序呢&#xff1f…

GDPU 数据结构 天码行空10

目录 数据结构实验十 树遍历应用一、【实验目的】二、【实验内容】三、【实验源代码】⭐ CPP版⭐ c语言版 四、实验结果 数据结构实验十 树遍历应用 一、【实验目的】 1、了解树的建立方法 2、掌握树与二叉树的转化及其遍历的基本方法 3、掌握递归二叉树遍历算法的应用 二、…

UiPath Studio 2023.10 Crack

UiPath Studio是一款功能强大且用户友好的集成开发环境 (IDE)&#xff0c;专为机器人流程自动化 (RPA) 设计。它由自动化技术领域的领先公司UiPath开发。 以下是 UiPath Studio 的一些主要功能和组件&#xff1a; 图形用户界面 (GUI)&#xff1a;UiPath Studio 具有直观且用户友…

【机器学习】 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)

1. 概念理解 逻辑回归&#xff0c;简称LR&#xff0c;它的特点是能够将我们的特征输入集合转化为0和1这两类的概率。一般来说&#xff0c;回归不用在分类问题上&#xff0c;但逻辑回归却能在二分类(即分成两类问题)上表现很好。 逻辑回归本质上是线性回归&#xff0c;只是在特…

2311rust,1.31版本更新

1.31.0稳定版 Rust1.31可能是最激动人心的版本! 使用Cargo创建一个新项目: cargo new foo以下是Cargo.toml的内容: [package] name "foo" version "0.1.0" authors ["名字"] edition "2018" //版本. [dependencies]在[package]…

数据采集与大数据架构分享

实现场景 要实现亿级数据的长期收集更新&#xff0c;并对采集后的数据进行整理和加工&#xff0c;用于人工智能的训练数据素材集。 数据采集 java支持的爬虫框架还是有很多的&#xff0c;如&#xff1a;webMagic、Spider、Jsoup等添加链接描述 pipeline处理管道 数据并发开发…

2023年【危险化学品经营单位安全管理人员】考试题及危险化学品经营单位安全管理人员模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试题是安全生产模拟考试一点通总题库中生成的一套危险化学品经营单位安全管理人员模拟试题&#xff0c;安全生产模拟考试一点通上危险化学品经营单位安全管理人员作业手机同步练习。…

操作系统(五)| 文件系统上 结构 存取方式 文件目录 检索

文章目录 1 文件系统概述2 文件的结构与存取方式2.1 磁盘2.2 文件的物理结构2.2.1 连续结构2.2.2 链式结构2.2.3 索引结构 2.3 文件的存取方式 3 文件目录3.1 基本概念3.2 目录结构单级目录结构多级目录结构 3.3 文件目录检索3.3.1 目录检索文件寻址 3.4 文件目录的实现 1 文件…

4、FFmpeg命令行操作9

FFmpeg命令提取音视频数据 保留封装格式 ffmpeg -i test.mp4 -acodec copy -vn audio.mp4 ffmpeg -i test.mp4 -vcodec copy -an video.mp4 提取视频 保留编码格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264 强制格式:ffmpeg -i…

从0开始学习JavaScript--JavaScript 字符串与文本内容使用

JavaScript中的字符串和文本内容处理是前端开发中的核心技能之一。本文将深入研究字符串的创建、操作&#xff0c;以及文本内容的获取、修改等操作&#xff0c;并通过丰富的示例代码&#xff0c;帮助读者更全面地了解和应用这些概念。 JavaScript 字符串基础 字符串是JavaScr…

Spark算子 - Python

第1关&#xff1a;Transformation - map # -*- coding: UTF-8 -*- from pyspark import SparkContextif __name__ "__main__":#********** Begin **********## 1.初始化 SparkContext&#xff0c;该对象是 Spark 程序的入口sc SparkContext("local",&qu…

c++23中的新功能之十九继承的CTAD

一、继承 在c编程中&#xff0c;一定是脱离不开继承的。而继承中有很多小的细节需要关注&#xff0c;比如如何显示的使用父类的构造函数&#xff1f;如何通过构造函数来推导模板参数等等。这些小的细节&#xff0c;其实都是在实际应用中对一些相关技术的不断完善。 二、继承的…

微服务实战系列之Nacos

导语 欢迎来到 “Nacos” 的世界&#xff01; Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单…

Ubuntu环境下以编译源码的方式安装Vim

目录 1. Ubuntu环境 2. 下载编译vim 2.1 效果截图 3. 配置环境变量 1. Ubuntu环境 Linux chris-166 6.2.0-36-generic #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct 9 15:34:04 UTC 2 x86_64 x86_64 x86_64 GNU/Linux 2. 下载编译vim // 源码下载 chris_166chris-16…

文件传输客户端 SecureFX mac中文版支持多种协议

SecureFX mac是一款功能强大的文件传输客户端&#xff0c;可在 Mac 操作系统上使用。它由 VanDyke Software 公司开发&#xff0c;旨在为用户提供安全、可靠、高效的文件传输服务。 SecureFX 支持多种协议&#xff0c;包括 SFTP、SCP、FTP、FTP over SSL/TLS 和 HTTP/S。它使用…

联想系列台式机Win11系统改Win7系统BIOS设置步骤

联想最新一代的台式机默认操作系统Win11&#xff0c;采用UEFIGPT启动模式&#xff0c;并且开启了安全启动功能&#xff0c;一般用户不能直接将Win11改成Win7&#xff0c;如果需要更改操作系统&#xff0c;是需要再BIOS菜单中关闭安全启动功能的&#xff0c;并且把启动模式设置成…

2018年五一杯数学建模C题江苏省本科教育质量综合评价解题全过程文档及程序

2019年五一杯数学建模 C题 江苏省本科教育质量综合评价 原题再现 随着中国的改革开放&#xff0c;国家的综合实力不断增强&#xff0c;中国高等教育发展整体已进入世界中上水平。作为一个教育大省&#xff0c;江苏省的本科教育发展在全国名列前茅&#xff0c;而江苏省13个地级…

Django测试环境搭建及ORM查询(创建外键|跨表查询|双下划线查询 )

文章目录 一、表查询数据准备及测试环境搭建模型层前期准备测试环境搭建代码演示 二、ORM操作相关方法三、ORM常见的查询关键字四、ORM底层SQL语句五、双下划线查询数据查询&#xff08;双下划线&#xff09;双下划线小训练Django ORM __双下划线细解 六、ORM外键字段创建基础表…

Linux常用命令——bye命令

在线Linux命令查询工具 bye 命令用于中断FTP连线并结束程序。。 补充说明 bye命令在ftp模式下&#xff0c;输入bye即可中断目前的连线作业&#xff0c;并结束ftp的执行。 语法 bye实例 bye在线Linux命令查询工具

蓝眼开源云盘部署全过程(手动安装)

环境概述&#xff1a; 系统-Centos7.4 数据库-MySQL8 云盘系统-Tank4.0.1 前提&#xff1a;操作系统已完成安装&#xff0c;有外部网络。 一.安装数据库 cd到合适的目录进行下载安装操作&#xff0c;期间不要切换出去。 wget https://dev.mysql.com/get/mysql80-community-r…