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

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);
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《ToDesk云电脑vs青椒云性能测试,谁更能实现游戏自由?》

ToDesk云电脑vs青椒云性能测试 【前言】【使用云电脑的意义】【实测软件】【性能参数对比】1. 硬件配置2.游戏兼容性3. 延迟、流畅度与画面清晰度4. 用户体验5. 价格对比6. 附加功能 【游戏性能测试】《游戏一 黑悟空》《游戏二 赛博朋克 2077》《游戏三 CS反恐精英》 【本文小…

HarmonyOS开发5.0 net 启动界面设置

第一步、创建我们界面 第二步&#xff0c; 在EntryAbility中配置启动页面&#xff0c;在entry/src/main/ets/entryability/EntryAbility.ets中配置启动页面 配置如下 至此大功告成

python--函数详解二

一、作用域&#xff1a; 一个标识符的可见范围&#xff0c;这就是标识符的作用域&#xff0c;一般说的是变量的作用域 1.1、全局作用域 运行结果 在整个程序运行环境中可见。可以被多个函数重复多次使用 1.2、局部作用域 运行结果 这里调用a&#xff0c;显示未定义&#xff…

Etsy又被封号了!这次我终于搞懂了原因...

你是否真的了解在Etsy开店有哪些红线不能踩&#xff1f;你是否真的知道Etsy被封号后如何解决&#xff1f;本文我将探讨Etsy账号被封的常见原因&#xff0c;以及卖家可以采取的应对策略&#xff0c;以期减轻对跨境业务的伤害程度&#xff0c;感兴趣的商家速速码住&#xff0c;不…

大舍传媒:海外发稿的卓越选择——老挝新闻网报道及海外媒体发布服务

大舍传媒&#xff1a;海外发稿的卓越选择——老挝新闻网报道及海外媒体发布服务 在当今全球化的时代&#xff0c;信息的传播速度和范围至关重要。对于企业、组织和个人而言&#xff0c;能够在海外媒体上发布稿件&#xff0c;实现有效的宣传和推广&#xff0c;无疑是提升知名度…

如何找到网上爆款内容,快速复制扩大品牌声量

社媒内容爆款复制是现代营销中的一个重要策略&#xff0c;它对于提升品牌声量、曝光度和知名度具有显著效果。 首先什么是爆款&#xff1f; 爆款内容指的是在社交媒体或其他在线平台上迅速获得大量关注、分享和讨论的内容。 准确、及时找到这部分品牌相关的爆款内容&#xf…

在元神操作系统启动时自动执行任务脚本

1. 背景 本文主要介绍让元神操作系统启动时自动执行任务脚本的方法&#xff0c;适用于无人化任务执行目的。将任务脚本及相关的应用程序准备好之后&#xff0c;把装有元神操作系统的U盘插入目标电脑&#xff0c;然后打开电脑电源就会自动完成所设置的任务。 2. 方法 &#x…

Pandas JSON学习

1.JSON简介 JSON&#xff08;JavaScript Object Notation&#xff0c;JavaScript 对象表示法&#xff09;&#xff0c;是存储和交换文本信息的语法&#xff0c;类似 XML。JSON 比 XML 更小、更快&#xff0c;更易解析&#xff0c;Pandas 可以很方便的处理 JSON 数据。 [{"…

扫描电镜的超低温冷冻制样及传输技术(Cryo-SEM)

扫描电镜的超低温冷冻制样及传输技术(Cryo-SEM) 扫描电镜&#xff08;Scanning Electron Microscope&#xff0c;简称SEM&#xff09;是一种利用聚焦电子束扫描样品表面&#xff0c;通过检测二次电子或反射电子等信号来获取样品表面形貌信息的显微观察技术&#xff1b;然而&…

微服务设计模式 - 特性标志(Feature Flags)

微服务设计模式 - 特性标志&#xff08;Feature Flags&#xff09; 定义 特性标志&#xff08;Feature Flags&#xff09;&#xff0c;又称特性开关&#xff08;Feature Toggles&#xff09;&#xff0c;是一种常见的云计算设计模式&#xff0c;允许开发人员通过配置动态地打开…

Mac “屏幕保护程序启动或显示器关闭后需要密码“无效

屏幕保护程序启动或显示器关闭后需要密码只能选择“立即”的解决方法&#xff1a; 在 iPhone mirror中设置&#xff0c;每次询问权限。 参考&#xff1a;https://support.apple.com/en-us/120421

强势文化与弱势文化的交响:赋能认知

强势文化如同历史长河中的巨浪&#xff0c;以磅礴之力推动着社会的进步与变迁&#xff0c;其影响力深远而广泛&#xff0c;不仅塑造了民族的精神风貌&#xff0c;也深刻影响着个体的认知框架与行为模式。而弱势文化&#xff0c;则如细流涓涓&#xff0c;虽不显眼却蕴含着独特的…

虚拟机 Ubuntu 扩容

文章目录 一、Vmware 重新分配 Ubuntu 空间二、Ubuntu 扩容分区 一、Vmware 重新分配 Ubuntu 空间 先打开 Vmware &#xff0c;选择要重新分配空间的虚拟机 点击 编辑虚拟机设置 &#xff0c;再点击 硬盘 &#xff0c;再点击 扩展 选择预计扩展的空间&#xff0c;然后点击 扩展…

再探“构造函数”

文章目录 一. 初始化列表1.1 实现1.2 何时必须使用初始化列表2.3 尽量使用初始化列表 二. 类型转换2.1 内置类型 转换 类类型2.2 explicit&#xff1a;不转换2.3 构造函数多参数2.4 使用隐式转换 2.5 自定义---转换为--->自定义类型 三. 静态成员变量概念在main函数调用私有…

基于java+SpringBoot+Vue的“衣依”服装销售平台设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

smuge error

0 Preface/Foreword 1 解决方法 第一步&#xff1a;跳过大文件下载&#xff0c;到时候统一使用快速批处理fast batch git lfs install --skip-smudge 故意敲错指令&#xff0c;会出现git lfs install 的usage&#xff1a; 第二步&#xff1a;clone仓库 下载结果&#xff1a;…

新160个crackme - 089-fornixcrackme1

运行分析 需要破解Name和Serial PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida搜索找到关键字符串 动态分析关键函数&#xff0c;逻辑如上图&#xff0c;通过Name计算得到char_1&#xff0c;亦或后对比Serial&#xff0c;相等则返回成功信息 分析…

项目验收测试的工作流程是怎样的?

验收测试的工作流程可以分为以下几个主要步骤&#xff1a; 一、项目类型和范围确定 在项目启动初期&#xff0c;技术团队介入以了解项目的类型、检测内容和要求范围。 如有必要&#xff0c;针对特定项目&#xff08;如政府采购项目&#xff09;&#xff0c;需提前准备测试方…

读书笔记--类加载器

虚拟机设计团队把类的加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部实现&#xff0c;以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。 类加载器可以说是Java语言的一项创新&#xff…

软件测试学习笔记丨Selenium复用已打开浏览器

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22520 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…