javaAPI操作Elasticsearch

mapping属性


mapping是对索引库中文档的约束, 常见的mapping属性包括:

  • type: 字段数据类型,常见的简单类型有:
    • 字符串: text(可分词的文本), keyword(精确值, 例如: 品牌,国家)
    • 数值: long, integer, short, byte, double, float
    • 布尔: boolean
    • 日期: date
    • 对象: object
  • index: 是否创建索引, 默认为true
  • analyzer: 使用哪种分词器
  • properties: 该字段的子字段

索引库操作


创建索引库

PUT /zyw
{"mappings": {"properties": {"info": {"type": "text","analyzer": "ik_smart"},"email": {"type": "keyword","index": false},"name": {"type": "object","properties": {"firstName": {"type": "keyword"},"lastName":{"type":"keyword"}}}}}
}

查看索引库

GET /zyw

删除索引库

DELETE /zyw

修改索引库, 添加新字段

索引库和mapping一旦创建无法修改, 但是可以添加新字段

PUT /zyw/_mapping
{"properties": {"age": {"type": "integer"}}
}

文档操作


新增文档

POST /zyw/_doc/1
{"info": "java是最好的语言","email": "zy@163.com","name": {"firstName": "云","lastName": "赵"}
}

查询文档

GET /zyw/_doc/1

删除文档

DELETE /zyw/_doc/1

修改文档

  • 全量修改, 会删除旧文档, 添加新文档
PUT /zyw/_doc/1
{"info": "java是最好的语言","email": "zy@163.com","name": {"firstName": "云","lastName": "赵"}
}
  • 局部修改
POST /zyw/_update/1
{"doc": {"email": "test@163.com"}
}

RestClient操作索引库


在这里插入图片描述

  • 引入依赖
		<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency>

注意:
在这里插入图片描述
springboot管理了elasticsearch的部分依赖, 查看springboot的依赖管理
在这里插入图片描述
我们需要在pom文件中定义这个版本值,覆盖springboot的
在这里插入图片描述

  • HotelDoc.java
@Data
@NoArgsConstructor
public class HotelDoc {private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String location;private String pic;public HotelDoc(Hotel hotel) {this.id = hotel.getId();this.name = hotel.getName();this.address = hotel.getAddress();this.price = hotel.getPrice();this.score = hotel.getScore();this.brand = hotel.getBrand();this.city = hotel.getCity();this.starName = hotel.getStarName();this.business = hotel.getBusiness();this.location = hotel.getLatitude() + ", " + hotel.getLongitude();this.pic = hotel.getPic();}
}
  • hotel索引库
{"mappings": {"properties": {"id": {"type": "keyword"},"name": {"type": "text","analyzer": "ik_max_word","copy_to": "all"},"address": {"type": "keyword","index": false},"price": {"type": "integer"},"score": {"type": "integer"},"brand": {"type": "keyword","copy_to": "all"},"city": {"type": "keyword"},"starName": {"type": "keyword"},"business": {"type": "keyword","copy_to": "all"},"location": {"type": "geo_point"},"pic": {"type": "keyword","index": false},"all": {"type": "text","analyzer": "ik_max_word"}}}
}

基于elasticsearch的规则, id用keyword

  • 操作索引库
import com.zyw.elasticsearchdemo.constants.HotelConstants;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;public class ElasticsearchDemoApplicationTests {private RestHighLevelClient client;/*** 删除索引库*/@Testvoid deleteHotelIndex() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest("hotel");client.indices().delete(request, RequestOptions.DEFAULT);}/*** 判断索引库是否存在*/@Testvoid existHotelIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("hotel");boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists ? "索引库已经存在" : "索引库不存在");}/*** 创建索引库*/@Testvoid createHotelIndex() throws IOException {// 1.创建request对象CreateIndexRequest request = new CreateIndexRequest("hotel");// 2.准备请求的参数, DSL语句request.source(HotelConstants.MAPPING_TEMPLATE, XContentType.JSON);// 3. 发送请求client.indices().create(request, RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://82.114.174.50:9200")));}@AfterEachvoid tearDown() throws IOException {client.close();}
}

RestClient操作文档


import cn.hutool.json.JSONUtil;
import com.zyw.elasticsearchdemo.mapper.HotelMapper;
import com.zyw.elasticsearchdemo.pojo.Hotel;
import com.zyw.elasticsearchdemo.pojo.HotelDoc;
import org.apache.http.HttpHost;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.List;@SpringBootTest
public class ElasticsearchDemoApplicationTests1 {private RestHighLevelClient client;@Autowiredprivate HotelMapper hotelMapper;/*** 删除文档*/@Testvoid deleteDocument() throws IOException {DeleteRequest request = new DeleteRequest("hotel", "200216665");client.delete(request, RequestOptions.DEFAULT);}/*** 修改文档-局部更新, 全量和创建一样*/@Testvoid updateDocument() throws IOException {UpdateRequest request = new UpdateRequest("hotel", "200216665");request.doc("price", 2600, "starName", "六钻");client.update(request, RequestOptions.DEFAULT);}/*** 查询文档*/@Testvoid getDocument() throws IOException {// 准备request对象GetRequest request = new GetRequest("hotel", "200216665");// 发送请求GetResponse response = client.get(request, RequestOptions.DEFAULT);String json = response.getSourceAsString();HotelDoc hotelDoc = JSONUtil.toBean(json, HotelDoc.class);System.out.println(hotelDoc);}/*** 新增文档*/@Testvoid addDocument() throws IOException {// 根据id查询酒店数据Hotel hotel = hotelMapper.selectById(200216665);// 转换为文档对象HotelDoc hotelDoc = new HotelDoc(hotel);// 准备request对象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());// 准备json文档request.source(JSONUtil.toJsonStr(hotelDoc), XContentType.JSON);// 发送请求client.index(request, RequestOptions.DEFAULT);}/*** 批量导入文档*/@Testvoid batchAddDocument() throws IOException {List<Hotel> hotels = hotelMapper.selectList(null);BulkRequest request = new BulkRequest();for (Hotel hotel : hotels) {HotelDoc hotelDoc = new HotelDoc(hotel);request.add(new IndexRequest("hotel").id(hotelDoc.getId().toString()).source(JSONUtil.toJsonStr(hotelDoc), XContentType.JSON));}// 发送client.bulk(request, RequestOptions.DEFAULT);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://82.114.174.50:9200")));}@AfterEachvoid tearDown() throws IOException {client.close();}
}

DSL查询语法


分类和基本语法

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

全文检索查询

全文检索查询, 会对用户输入内容分词, 常用于搜索框搜索
在这里插入图片描述
在这里插入图片描述
建议把多个字段copy到一个字段里

精确查询

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

地理查询

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

复合查询

  • 复合(compound)查询: 复合查询可以将其他简单查询组合起来, 实现更复杂的搜索逻辑.
    • function score: 复分函数查询, 可以控制文档相关性算分, 控制文档排名. 例如百度竞价

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

搜索结果处理


排序

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

分页

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

高亮

在这里插入图片描述
在这里插入图片描述
默认字段要一致, 可以用require_field_match 取消一致

RestClient查询文档–高级查询


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

import cn.hutool.json.JSONUtil;
import com.zyw.elasticsearchdemo.pojo.HotelDoc;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
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.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;
import java.util.Map;public class QueryDocumentTest {private RestHighLevelClient client;/*** 高亮*/@Testvoid testHighlight() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().query(QueryBuilders.matchQuery("all", "维也纳"));// 高亮设置request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));SearchResponse response = client.search(request, RequestOptions.DEFAULT);handleResponse(response);}/*** 排序和分页*/@Testvoid sortAndPage() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().sort("price", SortOrder.ASC).from(20).size(5);request.source().query(QueryBuilders.matchAllQuery());SearchResponse response = client.search(request, RequestOptions.DEFAULT);handleResponse(response);}/*** bool查询* @throws IOException*/@Testvoid testBool() throws IOException {SearchRequest request = new SearchRequest("hotel");BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 添加termboolQuery.must(QueryBuilders.termQuery("city", "上海"));// 添加rangeboolQuery.filter(QueryBuilders.rangeQuery("price").lte(500));request.source().query(boolQuery);SearchResponse response = client.search(request, RequestOptions.DEFAULT);handleResponse(response);}/*** match查询*/@Testvoid testMatch() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().query(QueryBuilders.matchQuery("all", "如家"));SearchResponse response = client.search(request, RequestOptions.DEFAULT);handleResponse(response);}/*** 处理结果* @param response*/private static void handleResponse(SearchResponse response) {SearchHits searchHits = response.getHits();// 查询的总条数long total = searchHits.getTotalHits().value;System.out.println("total = " + total);// 查询的结果数组SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {// 得到sourceString json = hit.getSourceAsString();HotelDoc hotelDoc = JSONUtil.toBean(json, HotelDoc.class);// 获取高亮结果Map<String, HighlightField> highlightFields = hit.getHighlightFields();// 根据字段名获取高亮结果HighlightField highlightField = highlightFields.get("name");// 获取高亮值String name = highlightField.getFragments()[0].toString();// 覆盖非高亮结果hotelDoc.setName(name);System.out.println("hotelDoc = " + hotelDoc);}}/*** 查询所有* @throws IOException*/@Testvoid testMatchAll() throws IOException {SearchRequest request = new SearchRequest("hotel");request.source().query(QueryBuilders.matchAllQuery());SearchResponse response = client.search(request, RequestOptions.DEFAULT);handleResponse(response);}@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://82.114.174.50:9200")));}@AfterEachvoid tearDown() throws IOException {client.close();}
}

补充


  • 分词
POST /_analyze
{"text": "java是最好的语言","analyzer": "ik_smart"
}
  • 查所有
GET /hotel/_search

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

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

相关文章

Hive 数据迁移与备份

迁移类型 同时迁移表及其数据&#xff08;使用import和export&#xff09; 迁移步骤 将表和数据从 Hive 导出到 HDFS将表和数据从 HDFS 导出到本地服务器将表和数据从本地服务器复制到目标服务器将表和数据从目标服务器上传到目标 HDFS将表和数据从目标 HDFS 上传到目标 Hiv…

FX110网:“炒金热”再现,汇友却被困在了假冒万洲金业!

近日&#xff0c;一汇友炒金就选错了平台&#xff0c;他交易的“万洲金业”不对劲&#xff01; 在假冒“万洲金业”反复折腾 据汇友描述&#xff0c;他此前经朋友指导&#xff0c;下载了一个“万洲金业”的APP&#xff0c;该平台宣称为香港金银业贸易场AA类141号行员&#xff0…

在Linux系统安装MySQL步骤

准备工作&#xff1a;下载好mysql&#xff08;Mariadb&#xff09;安装包&#xff1a; 第一步&#xff1a;检查系统中是否有自带的MySQL&#xff08;Mariadb&#xff09;&#xff1b; # 下面这两个都执行一下 [rootcentos101 opt]# rpm -qa | grep mysql [rootcentos101 opt]#…

大数据面试题 —— Flume

目录 介绍 FlumeFlume 架构请说一下你提到的几种 source 的不同点Flume 传输数据时如何保证数据一致性TailDir 为什么可以断点重传说下Flume事务机制Sink 消费能力弱&#xff0c;Channel 会不会丢失数据数千个Flume要怎么统一配置&#xff0c;修改就分发吗Flume一个节点宕机了怎…

用 二层口 实现三层口 IP 通信的一个实现方法

我们一般用 undo portswitch 来将二层口转为三层口&#xff0c;但如果设备不支持的话&#xff0c;那么。。。 一、拓朴图&#xff1a; 二、实现方法&#xff1a; 起一个 vlan x&#xff0c;配置 vlanif地址&#xff0c;然后二层口划分到 vlan x 下&#xff0c;对端做同样的配置…

一、MySQL基础学习

目录 1、MySQL启动2、MySQL客户端连接3、SQL3.1、SQL语句分类3.2、DDL&#xff08;数据库定义语言&#xff09;3.2.1、操作数据库3.2.2、操作数据表 3.3、DML&#xff08;数据库操作语言&#xff09;3.3.1、增加 insert into3.3.2、删除 delete3.3.3、修改 update 3.4、DQL&…

用python模拟天体运动(二体运动与天体轨道稳定问题)

目录 1. 模拟天体运动的代码 2. 运行效果 3. 非平方反比(轨道稳定性问题) 1. 模拟天体运动的代码 接下来我们将用python模拟实现天体运动 以下是我们所需要的库&#xff1a; import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy …

Java安装及环境配置详细教程

1.1 下载 Java 安装包 官网下载链接[点击跳转] 建议下载202版本&#xff0c;因为202版本之后的 Oracle JDK 是商用收费的&#xff08;个人使用不收费&#xff09; 1.2 勾选红框中内容&#xff0c;然后点击下方下载 1.3 如果没有登录 Oracle 则会跳转到该页面&#xff0c;因为…

使用多元线性回归简单预测

模型和代码 数据格式如下&#xff1a;前21列作为模型输入X&#xff0c;最后5列作为模型输出Y。 训练集&#xff1a; 测试集&#xff1a; 代码&#xff1a; from numpy import genfromtxt import numpy as np from sklearn.ensemble import GradientBoostingRegressor from …

解锁编程潜能:ChatGPT如何革新软件开发

目录 一、背景 二、功能描述 三、总结 一、背景 在这个飞速发展的数字时代&#xff0c;软件开发的效率和质量成了衡量一个开发者能力的重要标准。随着人工智能技术的不断进步&#xff0c;越来越多的开发者开始寻找能够提升工作效率的新方法。我就是其中之一&#xff0c;最近…

蓝桥杯刷题(十一)

1.卡片 反向思考&#xff0c;看k种卡片可以分给几位同学 代码 n int(input()) k 1 while k*(k1)<2*n:k1 print(k)2.美丽的2 代码 def f(x)->bool:while x:if x%102:return Truex//10return False cnt 0 for i in range(1,2021):if f(i):cnt1 print(cnt)3.单词分析 …

vue3+vite项目打包遇到的问题

一、项目打包出现空白页 vite.config.js中&#xff0c;添加base: ./ import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({base: ./, })router/index.js&#xff0c;将路由模式改成hash模式 import { createRouter, createWe…

【c++】string类---标准库(STL)中的string类

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.STL(标准库) 1.1 什么是STL 1.2 STL的版本 1.3 STL的六大组件 1.4 STL的重要性 1.5 如何学习STL 6.STL的缺陷 2. 为什么要学习st…

C++有关内存的那些事

个人主页&#xff1a;PingdiGuo_guo 收录转栏&#xff1a;C干货专栏 前言 本篇博客是讲解关于C内存的一些知识点的。 文章目录 前言 1.内存函数 1.1memcpy函数 1.2memmove函数 1.3 memset函数 2.各数据类型占用 2.1bool类型 2.2char类型 2.3short、int、long类型及整数…

SegFormer 项目排坑记录

SegFormer 项目排坑记录 任务记录创建conda环境 准备数据库和预训练参数程序配置修改测试可视化训练 任务 需要复现SegFormer分割项目&#xff0c;似乎还有点麻烦&#xff0c;参考这几个进行复现&#xff0c;记录下过程&#xff1a; SegFormer mmsegmentation CSDN博客 知乎博…

Docker 安装 Nginx 容器部署前端项目

先安装docker Docker安装详情 安装Nginx镜像 1、拉去取Nginx镜像 Nginx官方镜像 docker pull nginx 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx:xxx 下载指定版本的Nginx镜像 (xxx指具体版本号)我们拉去1.24.0的nginx镜像 …

视频号视频下载需要小程序提供下载支持!

前言&#xff1a;和大家分享一个视频号视频下载的方法&#xff01;可以帮助用户使用的工具将视频号视频保存到手机相册的&#xff01; 有时候在刷视频号的时候碰到自己喜欢的视频就情不自禁的想要把他下载下来&#xff0c; 1&#xff1a;遇到喜欢的视频视频怎么下载 例如&am…

中国传统游戏-幻方-c/c++实现

幻方&#xff08;Magic Square&#xff09;是一种将数字安排在正方形格子中&#xff0c;使每行、列和对角线上的数字和都相等的方法。 幻方也是一种中国传统游戏。旧时在官府、学堂多见。它是将从一到若干个数的自然数排成纵横各为若干个数的正方形&#xff0c;使在同一行、同…

Pytorch框架—文本情感分类问题项目(二)

整体过程就是首先拿到了数据集微博100K&#xff0c;对个这个评论数据集进行处理&#xff0c;分类标签和评论内容。对评论内容进行分词处理&#xff0c;之后进行词频统计对高词频的进行编码&#xff0c;低词频的进用《UNK》表示&#xff0c;并使用《PAD》把他们扩展到等长列表便…

MATLAB编译器配置:MinGW

使用 MATLAB 2022b版本&#xff0c;查询编译器时如上&#xff0c;想安装个MinGW编译器&#xff0c;自带的附加资源管理不好使&#xff0c;只能换个别的法子&#xff0c;经过一些参考&#xff0c;总结如下。 步骤1.在这里下载一个MinGW.最新版本是10.3.0.然后默认安装&#xff…