ES(2)(仅供自己参考)

news2024/12/23 18:34:03

Java代码的索引库:

package cn.itcast.hotel;

import lombok.AccessLevel;
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.RestClientBuilder;
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.*;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

/**
 * es连接
 */
@SpringBootTest
public class HotelIndexTest {
    private RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.136.128:9200")
        ));
    }

    @Test
    public void init()
    {
        System.out.println(client);
    }

    /**
     * 创建索引库
     * @throws IOException
     */
    @Test
    public void createIndex() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("hotel");
        request.source("json", XContentType.JSON);
        client.indices().create(request, RequestOptions.DEFAULT);
    }

    /**
     * 删除一个索引库
     * @throws IOException
     */
    @Test
    public void deleteIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("hotel");
        client.indices().delete(request,RequestOptions.DEFAULT);
    }

    /**
     * 查看一个索引库是否存在
     * @throws IOException
     */
    @Test
    public void exitsIndex() throws IOException {
        GetIndexRequest request = new GetIndexRequest("hotel");
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists?"存在":"不存在");
    }



    @AfterEach
    void tearDown() {
        try {
            client.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

Java代码文档操作:

package cn.itcast.hotel;

import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.api.R;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
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;
import java.util.Map;

@SpringBootTest
public class HotelDocTest {

    private RestHighLevelClient client;
    @Autowired
    private IHotelService hotelService;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.136.128:9200")
        ));
    }

    @AfterEach
    void tearDown() {
        try {
            client.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 往索引库中插入一条数据
     * @throws IOException
     */
    @Test
    public void addDocumentIndex() throws IOException {
        Hotel hotel = hotelService.getById(46829L);
        HotelDoc hotelDoc = new HotelDoc(hotel);

        IndexRequest request = new IndexRequest("hotel");
        request.source(JSON.toJSONString(hotelDoc), XContentType.JSON).id(hotel.getId().toString());
        client.index(request, RequestOptions.DEFAULT);
    }

    //查询某一条数据,根据id查询
    @Test
    public void queryIndex() throws IOException {
        GetRequest request = new GetRequest("hotel","46829");
        GetResponse document = client.get(request, RequestOptions.DEFAULT);
        String index = document.getIndex();
        Map<String, Object> source = document.getSource();
        System.out.println(source);
    }

    //更改某一个文档数据的内容
    @Test
    public void updateIndex() throws IOException {
        UpdateRequest request = new UpdateRequest("hotel","46829");

        request.doc(
                "pic","Cc",
                "score","115"
                );

        client.update(request,RequestOptions.DEFAULT);
    }

    //删除某一个id的文档数据
    @Test
    public void deleteIndex() throws IOException {
        DeleteRequest request = new DeleteRequest("hotel","46829");
        client.delete(request,RequestOptions.DEFAULT);
    }

    //批量操作,bulk,可以批量插入,删除,更新
    //批量插入
    @Test
    public void bulkIndex() throws IOException {
        BulkRequest request = new BulkRequest();
        List<Hotel> list = hotelService.list();
        list.stream().forEach((hotel)->{        //stream流操作,实现循环操作
            HotelDoc hotelDoc = new HotelDoc(hotel);
            IndexRequest indexRequest = new IndexRequest("hotel");
            indexRequest.source(JSON.toJSONString(hotelDoc),XContentType.JSON).id(hotel.getId().toString());
            request.add(indexRequest);
        });

        client.bulk(request,RequestOptions.DEFAULT);
    }


}

索引库查询搜索操作:

#全部查询,默认返回页数大小为10个
GET /hotel/_search
{
  "query": {
    "match_all": {}
  }
}

# 组合查询,根据符合的score值,做排序
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "北京酒店"
    }
  }
}

#在多个字段中查询,跟组合查询差不多,但是这个浪费时间
GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "外滩如家",
      "fields": ["name","brand","business"]
    }
  }
}

#精准查询,例如keyword或者其他数字。
GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "上海"
      }
    }
  }
}

#范围查询,根据某个数字的大小范围
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 10,   #大于等于
        "lte": 200   #小于等于
      }
    }
  }
}


#坐标查询,范围查询,根据当前坐标点,查询某个范围的
GET /hotel/_search
{
  "query": {
    "geo_distance":
    {
      "distance": "3km",
      "position": "31.21, 121.5"
    }
  }
}

DELETE /hotel


#functionscore查询,自己根据查出来的文档
#再将这些文档进行一个筛选
#让你想让他评分高的高,排在前面
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "北京酒店"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "brand": "如家"
            }
          },
          "weight": 5
        }
      ],
      "boost_mode": "multiply"
    }
  }
}

复合查询:简单查询的组合,实现复杂的查询

相关性算分(function score):算分查询,可以控制文档相关性算分,控制文档排名。例如百度竞价

bool查询:

GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "brand": {
              "value": "如家"
            }
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "FIELD": {
              "gt": 400
            }
          }
        }
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "10km",
            "position": "31.2, 121.5"
          }
        }
      ]
    }
  }
}

数字排序sort:(双条件排序)

#sort排序,如果指定排序方式。默认的打分为null
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "score": {
        "order": "desc"
      },
      "price": {
        "order": "asc"
      }
    }
  ]
}

地理坐标排序(根据排序会给出sort距离)

#sort排序坐标121.612282,31.034661,按照这个坐标升序排序
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "position": {
          "lat": 31.034661,
          "lon": 121.612282
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ]
}

分页查询(类似于MySQL的  limit offset(开始的位置,偏移量),raw(行数)):

#分页查询(默认页大小为10,开始位置为0)
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,  #从哪里开始
  "size": 3   #页数大小
}

 from+size实现方式:

from+size是通过将0-某个数字的文档全部查询出来,然后通过截取方式获取某段文档。比如查询9990-10000的数据,es会首先查询出0-10000的数据,在对0-10000的数据截取,截取出9990-10000的文档数据。

如果是在分布式集群下面(es集群是为了尽可能多的存储数据,所以每个集群的数据不同)

你查询9990-10000的数据就是从每个集群中查询0-10000的数据,然后将所有文档数据排序,然后将数据截取。

造成的问题,每个集群查需要时间,数据之间的排序需要时间,耗费的时间很大很大。

查询高亮处理:(通过服务端给的标签<em></em>,前段给这个字段这是css)

#搜索的字段必须与高亮的字段匹配,如果不匹配可以设置"require_field_match": "false"
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "require_field_match": "false"
      }
    }
  }
}

Java代码:

package cn.itcast.hotel;

import cn.itcast.hotel.service.IHotelService;
import com.baomidou.mybatisplus.extension.api.R;
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.sort.SortOrder;
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;

@SpringBootTest
public class HotelSearchTest {

    private RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.136.128:9200")
        ));
    }

    @AfterEach
    void tearDown() {
        try {
            client.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    //查询全部,显示10个
    @Test
    public void matchAll() throws IOException {
        SearchRequest request = new SearchRequest("hotel");
        request.source().query(QueryBuilders.matchAllQuery());
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        print(response);
    }
    //根据字段查询,一个字段
    @Test
    public void match() throws IOException {
        SearchRequest request = new SearchRequest("hotel");
        request.source().query(QueryBuilders.matchQuery("brand","如家"));

        SearchResponse search = client.search(request, RequestOptions.DEFAULT);
        print(search);
    }
    //精确查询
    @Test
    public void term() throws IOException {
        SearchRequest request = new SearchRequest("hotel");

        request.source().query(QueryBuilders.termQuery("city","北京"));

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        print(response);
    }
    //范围查询
    @Test
    public void range() throws IOException {
        SearchRequest request = new SearchRequest("hotel");

        request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(150));

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        print(response);
    }
    //bool查询
    @Test
    public void bool() throws IOException {
        SearchRequest request = new SearchRequest("hotel");
        BoolQueryBuilder must = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("city", "上海"));
        must.filter(QueryBuilders.termQuery("brand","如家"));
        request.source().query(must);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        print(response);
    }

    //排序设置
    @Test
    public void sort() throws IOException {
        SearchRequest request = new SearchRequest("hotel");

        request.source().query(QueryBuilders.termQuery("city","北京"));
        request.source().sort("price", SortOrder.ASC);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        print(response);
    }
    //分页和页数大小
    @Test
    public void page() throws IOException {
        SearchRequest request = new SearchRequest("hotel");

        request.source().query(QueryBuilders.termQuery("city","北京"));
        request.source().size(3).from(2);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        print(response);
    }
    //高亮设置
    @Test
    public void highlight() throws IOException {
        SearchRequest request = new SearchRequest("hotel");

        request.source().query(QueryBuilders.matchQuery("city","北京"));
        request.source().highlighter(new HighlightBuilder().field("city").requireFieldMatch(false));
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        print(response);
    }


    private void print(SearchResponse response)
    {
        SearchHits searchHits = response.getHits();
        SearchHit[] hits = searchHits.getHits();
        long value = searchHits.getTotalHits().value;
        System.out.println("总数:"+value);
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            System.out.println(sourceAsString);
        }
    }
}

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

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

相关文章

【机器学习】24. 聚类-层次式 Hierarchical Clustering

1. 优势和缺点 优点&#xff1a; 无需提前指定集群的数量 通过对树状图进行不同层次的切割&#xff0c;可以得到所需数量的簇。树状图提供了一个有用的可视化-集群过程的可解释的描述树状图可能揭示一个有意义的分类 缺点&#xff1a; 计算复杂度较大, 限制了其在大规模数据…

Rust 力扣 - 2379. 得到 K 个黑块的最少涂色次数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 本题可以转换为求长度为k的子数组中白色块的最少数量 我们遍历长度为k的窗口&#xff0c;我们只需要记录窗口内的白色块的数量即可&#xff0c;遍历过程中刷新白色块的数量的最小值 题解代码 impl Solution {…

Git创建和拉取项目分支的应用以及Gitlab太占内存,如何配置降低gitlab内存占用进行优化

一、Git创建和拉取项目分支的应用 1. 关于git创建分支&#xff0c; git创建分支&#xff0c;可以通过git管理平台可视化操作创建&#xff0c;也可以通过git bash命令行下创建&#xff1a; A. 是通过git管理平台创建&#xff1a; 进入gitlab管理平台具体的目标项目中&#xff…

ubuntu-开机黑屏问题快速解决方法

开机黑屏一般是由于显卡驱动出现问题导致。 快速解决方法&#xff1a; 通过ubuntu高级选项->recovery模式->resume->按esc即可进入recovery模式&#xff0c;进去后重装显卡驱动&#xff0c;重启即可解决。附加问题&#xff1a;ubuntu的默认显示管理器是gdm3,如果重…

《高频电子线路》 —— 反馈型振荡器

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 反馈型振荡器基本工作原理 振荡器分类 自激&#xff1a;没有信号输入他激&#xff1a;有信号输入RC振荡器主要产生低频的正弦波&#x…

unity发布webGL

1.安装WebGL板块 打开unity&#xff0c;进入该界面&#xff0c;然后选择圈中图标 选择添加模块 选择下载WebGL Build Support 2.配置项目设置 打开一个unity项目&#xff0c;如图进行选择 如图进行操作 根据自己的情况进行配置&#xff08;也可直接点击构建和运行&#xff09…

nodejs批量修改word文档目录样式

工作中遇到一个需求:写个nodejs脚本,对word文档(1000+个)的目录页面进行美化。实现过程遇到不少麻烦,在此分享下。 整体思路 众所周知,Docx格式的Word文档其实是个以xml文件为主的zip压缩包,所以,页面美化整体思路是:先将文档后缀名改为zip并解压到本地,然后将关键的…

c++仿函数--通俗易懂

1.仿函数是什么 仿函数也叫函数对象&#xff0c;是一种可以像函数一样被调用的对象。从编程实现的角度看&#xff0c;它是一个类&#xff0c;不过这个类重载了函数调用运算符() class Add { public:int operator()(int a, int b) {return a b;} }; 注意&#xff1a;使用的时…

玩转Docker | Docker基础入门与常用命令指南

玩转Docker | Docker基础入门与常用命令指南 引言基本概念help帮助信息常用命令管理镜像运行容器构建镜像其他Docker命令整理结语引言 Docker 是一种开源的应用容器引擎,它允许开发者将应用程序及其依赖打包进一个可移植的容器中,然后发布到任何流行的 Linux 机器上。这大大简…

【机器学习】22. 聚类cluster - K-means

聚类cluster - K-means 1. 定义2. 测量数据点之间的相似性3. Centroid and medoid4. Cluster之间距离的测量方式5. 聚类算法的类别6. K-mean7. 如何解决中心初始化带来的影响8. K-means问题&#xff1a;处理空集群9. 离群值的问题10. Bisecting K-means&#xff08;二分K-means…

wsl2.0(windows linux子系统)使用流程

1.什么是wsl wsl指的是windows的linux子系统&#xff0c;最初是wsl1.0&#xff0c;靠windows内核来模拟linux内核&#xff0c;并不运行真正的linux内核&#xff0c;所以有时会有兼容性的问题。 而wsl2.0是基于windows自带的虚拟机功能hyper-v的&#xff0c;它会把设备上的每个…

大数据新视界 -- 大数据大厂之数据质量管理全景洞察:从荆棘挑战到辉煌策略与前沿曙光

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

硅谷甄选(11)角色管理

角色管理模块 10.1 角色管理模块静态搭建 还是熟悉的组件&#xff1a;el-card、el-table 、el-pagination、el-form <template><el-card><el-form :inline"true" class"form"><el-form-item label"职位搜索"><el-…

这5个堪称每日必看的网站,你都有所了解吗?

身为一名出色的UI设计师&#xff0c;能够迅速捕捉灵感、始终保持敏锐的审美眼光以及时刻洞悉行业动态&#xff0c;无疑是必备的职业素养与技能。今儿个小编就特意为各位小伙伴精心梳理了一些UI设计师绝对不容错过的绝佳网站哦。通过浏览这些网站&#xff0c;大家可以第一时间掌…

安全成为大模型的核心;大模型安全的途径:大模型对齐

目录 安全成为大模型的核心 大模型安全的途径:大模型对齐 人类反馈强化学习(RLHF) 直接偏好优化(DPO) 安全成为大模型的核心 大模型安全的途径:大模型对齐 大模型对齐技术(Alignment Techniques for Large Language Models)是确保大规模语言模型(例如GPT-4)的输…

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

练习LabVIEW第三十题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十题&#xff1a; 用labview写一个获取当前系统时间的程序 开始编写&#xff1a; 前面板添加一个字符串显示控件&am…

NVR设备ONVIF接入平台EasyCVR视频分析设备平台视频质量诊断技术与能力

视频诊断技术是一种智能化的视频故障分析与预警系统&#xff0c;NVR设备ONVIF接入平台EasyCVR通过对前端设备传回的码流进行解码以及图像质量评估&#xff0c;对视频图像中存在的质量问题进行智能分析、判断和预警。这项技术在安防监控领域尤为重要&#xff0c;因为它能够确保监…

springboot框架使用mybatis-plus3.5.1以下版本的代码生成器工具类

我们在使用springboot 框架 和mybatis-plus 开发web项目的时候&#xff0c;像 控制器 这类的文件 有了这个基于mybatis-plus 的 代码生成器 我们就不必自己创建了 &#xff0c;直接执行后 自动帮我们生成好控制器、服务处、实现层 等等 非常的方便 。 废话不多说&#xff0c;还…

价值为王,浅析基础大模型行业应用创新发展新路径

在2024年7月的世界人工智能大会&#xff08;WAIC&#xff09;上&#xff0c;百度董事长兼首席执行官李彦宏关于大模型的演讲引起了广泛关注。他在演讲中强调了大模型应用的重要性&#xff0c;并提出了一个观点&#xff1a;“没有应用的大模型一文不值”。这一观点直指当前人工智…