05_es分布式搜索引擎1

news2024/11/17 1:58:48

一、初始elasticsearch

1.elasticsearch简单介绍

①什么是elasticsearch?

开源的分布式搜索引擎,实现海量数据搜索,日志统计,分析,系统监控等功能

②什么是elastic stack?

是以elasticsearch为核心的技术栈,包括beats,Logstash,kibana, elasticsearch

③什么是Lucene?

是Apache开源搜索引擎类库,提供搜索引擎的API

2.正向索引和倒排索引

①什么是文档document和词条term?

文档:每一条数据就是文档

词条:对文档的内容分词

②什么是正向索引?

基于文档id创建索引,查询词条时必须找到文档,然后判断该文档是否包含词条。

③什么是倒排索引?

对文档内容进行分词,对词条创建索引,并记录词条所在文档的信息。

搜索时要进行分词,然后去词条列表查询文档id,通过文档id查询文档,把结果存放在结果集。

④倒排索引的组成

词条词典:记录所有词条, 词条和倒排列表PostingList之间关系。给词条创建索引,提高查询和插入效率

倒排列表PostingList:记录词条所在的文档id,词条出现频率,词条在文档的位置

 

3.ES的基本概念

①索引index:

同类型文档的集合。类似Mysql的表table

②文档document:

一条数据就是一个文档,文档数据在es是Json格式。类似Mysql的行row

③字段field:

Json文档的字段。类似Mysql的列

④映射Mapping:

字段的类型约束信息,类似表的结构约束

4.ES-MySQL的架构

ES:海量数据搜索

Mysql:事务操作,数据安全性和一致性

二、索引库操作

1.索引库 (建表)的概念

①mapping是对文档字段的约束。

②mapping约束的属性

type:字段类型(

字符串:text(分词)、keyword(不分词)

数字:long、integer、short、byte、double、float

布尔:boolean

日期:date

对象:object

index:该字段是否用约束,默认true

analyzer:使用的分词器

properties:该字段下的子字段

2.创建索引库

ES通过Restful请求操作索引库和文档。请求内容通过DSL语句表示

 创建索引库:创建一个索引库heima,有字段info,email,name有子字段firstName, lastName

# 创建索引库heima
PUT /heima
{
  "mappings": {
    "properties": {
      "info":{
        "type":"text",
        "analyzer":"ik_smart"
      },
      "email":{
        "type": "keyword",
        "index": false
      },
      "name":{
        "type": "object", 
        "properties": {
          "firstName":{
            "type":"keyword"
          },
          "lastName":{
            "type":"keyword"
          }
        }
      }
    }
  }
}

查看索引库:GET /索引库名

删除索引库:DELETE /索引库名

添加索引库字段:PUT /索引库名/_mapping

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

3.文档操作(添加数据)

①增

POST /heima/_doc/1
{
  "age": 20,
  "info": "这是学生",
  "email": "1111@qq.com",
  "name": {
    "lastName": "wang",
    "firsrName":"zhi"
  }
}

②删

DELETE /索引库名/_doc/文档id

③改

方式一:根据主键值id全量修改,删除旧文档,新增以下字段文档。此时只有age

PUT /heima/_doc/1
{
  "age": 10
}

方式二:修改某个字段值,只把年龄修改

POST /heima/_update/1
{
  "doc":{
    "age": 10
  }
  
}

④查

GET /索引库名/_doc/文档id

GET /heima/_doc/1

4.文档操作有哪些?

  • 创建文档:POST /索引库名/_doc/文档id  { json文档 }
  • 查询文档:GET /索引库名/_doc/文档id
  • 删除文档:DELETE /索引库名/_doc/文档id
  • 修改文档:

        全量修改:PUT /索引库名/_doc/文档id { json文档 }

        增量修改:POST /索引库名/_update/文档id { "doc": {字段}}

三、RestClient操作索引库

1.什么是RestClient

RestClient本质是组装DSL语句,通过http请求发送ES

2.利用JavaRestClient实现创建、删除索引库。判断索引库是否存在

步骤1:导入资料包hotel-demo

步骤2:分析数据结构

①mapping要考虑问题:字段名,数据类型type,是否搜索index,是否分词analyzer(分词器)

mapping映射

# 酒店的mapping
PUT /hotel
{
  "mappings": {
    "properties": {
      "id":{
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "address":{
        "type": "keyword",
        "index": false
      },
      "price":{
        "type": "integer"
      },
      "score":{
        "type":"integer"
      },
      "brand":{
        "type":"keyword"
      },
       "city":{
        "type":"keyword"
      },  
       "starName":{
        "type":"keyword"
      },
       "business":{
        "type":"keyword"
      },
      "location":{
        "type":"geo_point"
      },
       "pic":{
        "type":"keyword",
        "index":false
      }
    }
  }
}

修改:把全部搜索的字段组合放在all字段

# 酒店的mapping
PUT /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"
      },
      "location":{
        "type":"geo_point"
      },
       "pic":{
        "type":"keyword",
        "index":false
      },
      "all":{
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

步骤3:初始化JavaRestClient

①导入es依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.12.1</version>
</dependency>

②初始化RestHighLevelClient:

public class HotelIndexTest {
   private RestHighLevelClient client;
   @Test
   void testInit(){
      
   }
   @BeforeEach
   void setUp() {
      this.client = new RestHighLevelClient(RestClient.builder(
            HttpHost.create("http://192.168.137.129:9200")
      ));
   }
   @AfterEach
   void tearDown() throws IOException {
      this.client.close();
   }

}

所有的单元测试,先运行@BeforeEach再@Test,最后@AfterEach

步骤4:

MAPPING_TEMPLATE

public class HotelConstants {
	public static final String MAPPING_TEMPLATE =
			"{\n" +
			"  \"mappings\": {\n" +
			"    \"properties\": {\n" +
			"      \"id\":{\n" +
			"        \"type\": \"keyword\"\n" +
			"      },\n" +
			"      \"name\":{\n" +
			"        \"type\": \"text\",\n" +
			"        \"analyzer\": \"ik_max_word\",\n" +
			"        \"copy_to\": \"all\"\n" +
			"      },\n" +
			"      \"address\":{\n" +
			"        \"type\": \"keyword\",\n" +
			"        \"index\": false\n" +
			"      },\n" +
			"      \"price\":{\n" +
			"        \"type\": \"integer\"\n" +
			"      },\n" +
			"      \"score\":{\n" +
			"        \"type\":\"integer\"\n" +
			"      },\n" +
			"      \"brand\":{\n" +
			"        \"type\":\"keyword\",\n" +
			"        \"copy_to\": \"all\"\n" +
			"      },\n" +
			"       \"city\":{\n" +
			"        \"type\":\"keyword\"\n" +
			"      },  \n" +
			"       \"starName\":{\n" +
			"        \"type\":\"keyword\"\n" +
			"      },\n" +
			"       \"business\":{\n" +
			"        \"type\":\"keyword\"\n" +
			"      },\n" +
			"      \"location\":{\n" +
			"        \"type\":\"geo_point\"\n" +
			"      },\n" +
			"       \"pic\":{\n" +
			"        \"type\":\"keyword\",\n" +
			"        \"index\":false\n" +
			"      },\n" +
			"      \"all\":{\n" +
			"        \"type\": \"text\",\n" +
			"        \"analyzer\": \"ik_max_word\"\n" +
			"      }\n" +
			"    }\n" +
			"  }\n" +
			"}\n";
	

}

①创建索引库

@Test
void createHotelIndex() throws IOException {
   // 1.创建request对象(索引库)
   CreateIndexRequest request = new CreateIndexRequest("hotel");
   // 2.请求参数(mapping)
   request.source(MAPPING_TEMPLATE, XContentType.JSON);
   // 3.发送请求(创建)
   client.indices().create(request, RequestOptions.DEFAULT);
}

②查询索引库是否存在

@Test
void getHotelIndex() throws IOException {
   // 1.创建查询对象
   GetIndexRequest request = new GetIndexRequest("hotel");
   // 2.执行查询
   Boolean response = client.indices().exists(request, RequestOptions.DEFAULT);
   System.out.println(response);
}

③删除索引库

@Test
void deleteHotelIndex() throws IOException {
   // 1.创建删除对象
   DeleteIndexRequest request = new DeleteIndexRequest("hotel");
   // 2.执行删除
   client.indices().delete(request,RequestOptions.DEFAULT);
}

索引库操作的基本步骤:

  • 初始化RestHighLevelClient
  • 创建XxxIndexRequest。XXX是Create、Get、Delete
  • 准备DSL( Create时需要)
  • 发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete

四、RestClient操作文档

1.添加文档client.index()

①查询数据库里面ID号为38609酒店信息

②把查询的信息转换为json插入,id从信息里面获取

@Test
void testIndexDocument() throws IOException {
   // 1.根据id查询
   Hotel hotel = hotelService.getById(38609L);
   // 转换为文档数据
   HotelDoc hotelDoc = new HotelDoc(hotel);

   // 2.创建request对象
   IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
   // 创建JSON文档
   request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
   // 发送请求
   client.index(request, RequestOptions.DEFAULT);
}

2.查询文档client.get()

@Test
void testGetIndex() throws IOException {
   // 查询请求
   GetRequest request = new GetRequest("hotel","38609");
   // 发送请求
   GetResponse response = client.get(request, RequestOptions.DEFAULT);
   // 获取结果_source的JSON
   String json = response.getSourceAsString();
   // JSON转换为对象
   HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
   System.out.println(hotelDoc);

}

3.更新文档client.update()

@Test
void testUpdate() throws IOException {
   // 更新请求
   UpdateRequest request = new UpdateRequest("hotel","38609");
   // 更新字段 K,V 逗号隔开
   request.doc(
         "price","666",
         "starName","四钻"
   );
   // 执行更新
   client.update(request,RequestOptions.DEFAULT);

}

4.根据ID删除文档

@Test
void testDelete() throws IOException {
   // 删除请求
   DeleteRequest request = new DeleteRequest("hotel","38609");
   // 执行删除
   client.delete(request,RequestOptions.DEFAULT);
}

5.批量导入数据BulkRequest

@Test
void testBulk() throws IOException {
   // 查询数据
   List<Hotel> hotels = hotelService.list();
   // 创建Request
   BulkRequest request = new BulkRequest();
   // 批量数据
   for (Hotel hotel : hotels) {
      HotelDoc hotelDoc = new HotelDoc(hotel);
      request.add(new IndexRequest("hotel")
            .id(hotelDoc.getId().toString())
            .source(JSON.toJSONString(hotelDoc),XContentType.JSON));
   }
   // 执行添加
   client.bulk(request,RequestOptions.DEFAULT);
}

6.总结文档操作步骤

  • 初始化RestHighLevelClient
  • 创建XxxRequest。XXX是Index、Get、Update、Delete
  • 准备参数(Index和Update时需要)
  • 发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete
  • 解析结果(Get时需要)

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

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

相关文章

【COMP304 LEC4 LEC5】

LEC 4 1. Truth-Functionality Propositional logic 的connectives&#xff08;连接词&#xff09;are truth-functional 但是&#xff0c;有时候的描述不是true-functional的&#xff0c;比如&#xff1a;"Knowing that", "It is necessary that",&quo…

微信小程序开发-微信支付退款功能【附有完整代码】

之前有写过详细的微信支付功能&#xff1a;微信支付 我们使用weixin-java-pay的jar包等&#xff0c;配置上的流程同微信支付&#xff0c;可以看上面的文章。 退款使用的WxPayService类的refundV3方法。使用该方法需要在微信支付配置的基础上加上&#xff1a;apiclient_key.pem…

Linux期末复习——多线程编程

线程概述 线程基本编程 函数说明 pthread_create(): 创建线程&#xff0c;成功返回0pthread_exit(): 主动退出线程&#xff0c;成功返回0pthread_join(): 挂起线程等待结束&#xff0c;成功返回0pthread_cancel在别的线程中终止另一个线程的执行&#xff0c;成功返回0 示例…

sql文件批处理程序-java桌面应用

项目效果&#xff1a; 支持sql文件夹批处理&#xff0c;选中文件夹或者sql文件 支持测试连接&#xff0c;可以校验数据库配置 支持报错回显&#xff0c;弹出报错文件名以及问题语句 支持在程序中修改错误语句&#xff0c;用户可以选择保存修改内容继续执行或不保存修改只执行…

线性代数 第四章 线性方程组

一、矩阵形式 经过初等行变换化为阶梯形矩阵。当&#xff0c;有解&#xff1b;当&#xff0c;有非零解。 有解&#xff0c;等价于 可由线性表示 克拉默法则&#xff1a;非齐次线性方程组中&#xff0c;系数行列式&#xff0c;则方程组有唯一解&#xff0c;且唯一解为 其中是…

TestCenter测试管理工具

estCenter&#xff08;简称TC&#xff09;一款广受好评的测试管理工具&#xff0c;让测试工作更规范、更有效率&#xff0c;实现测试流程无纸化&#xff0c;测试数据资产化。 产品概述 TC流程图 产品功能 一、案例库 案例库集中化管理&#xff0c;支持对测试用例集中管理&…

Gartner报告 | Mendix再次成为低代码领导者!Mendix在愿景完整性和执行能力领域的排名最为靠前。

本文作者: Hans de Visser, Mendix 首席产品官 在最新发布的2023 Gartner魔力象限图™ 中对于企业级低代码应用程序平台&#xff0c;Gartner指出&#xff0c;企业IT领导者需要满足“应用程序开发向更高抽象级别迈进的步伐&#xff0c;并采用低代码平台来加速应用程序开发。” 此…

【华为】路由器以PPPoE拨号接入广域网

组网需求 用户希望以PPPoE拨号方式接入广域网&#xff0c;如图1所示&#xff0c;Router作为PPPoE客户端&#xff0c;得到PPPoE服务器的认证后获得IP地址&#xff0c;实现用户接入互联网的需求。内网网关地址&#xff08;即VLANIF1接口的IP地址&#xff09;为10.137.32.1/24。 …

N-131基于jsp,ssm物流快递管理系统

开发工具&#xff1a;eclipse&#xff0c;jdk1.8 服务器&#xff1a;tomcat7.0 数据库&#xff1a;mysql5.7 技术&#xff1a; springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分&#xff0c;功能介绍如下&#xff1a; 一、用户(前台)功能&#xff1a; 用…

UE5 Android下载zip文件并解压缩到指定位置

一、下载是使用市场的免费插件 二、解压缩是使用市场的免费插件 三、Android路径问题 windows平台下使用该插件没有问题&#xff0c;只是在Android平台下&#xff0c;只有使用绝对路径才能进行解压缩&#xff0c;所以如何获得Android下的绝对路径&#xff1f;增加C文件获得And…

生态扩展:Flink Doris Connector

生态扩展&#xff1a;Flink Doris Connector 官网地址&#xff1a; https://doris.apache.org/zh-CN/docs/dev/ecosystem/flink-doris-connector flink的安装&#xff1a; tar -zxvf flink-1.16.0-bin-scala_2.12.tgz mv flink-1.16.0-bin-scala_2.12.tgz /opt/flinkflink环境…

【c++|opencv】二、灰度变换和空间滤波---5.中值滤波

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 1. 中值滤波 #include<iostream> #include<opencv2/opencv.hpp> #include"Salt.h"using namespace cv; using namespace std;voi…

NEFU离散数学实验4-数论

相关概念 离散数学中的数论相关概念和公式如下&#xff1a; 1.最大公约数(GCD)&#xff1a;两个整数a和b的最大公约数是能够同时整除a和b的最大正整数&#xff0c;记作GCD(a, b)。 2.最小公倍数(LCM)&#xff1a;两个整数a和b的最小公倍数是能够同时整除a和b的最小正整数&#…

MySQL-Galera-Cluster集群详细介绍

目录 一、什么是Mysql集群&#xff1f;1.单节点mysql存在的常见问题2.mysql集群介绍3.Mysql集群的优点和风险 二、Mysql集群的一些疑问1.mysql的AB复制和Galera Cluster有什么区别&#xff1f;2.什么情况下适用AB复制&#xff0c;什么情况下使用Galera cluster&#xff1f;3.可…

给出n个字母(a-z),找出出现次数最多的字母并输出。(附ASCII码表)

Result01&#xff1a; 两层for循环枚举&#xff0c;时间复杂度为O(N2)&#xff0c;空间复杂度O(1)。 //暴力解&#xff1a;public static char Result01(char[] chars) {int maxNums 0;//保存最大出现次数int index 0;//记录出现次数最多的元素在数组中的下标for (int i …

初识【Java类和对象】

目录 1.面向对象的初步认知 1.1什么是面向对象? 1.2面向对象与面向过程 2.类定义和使用 2.1简单认识类 2.2类的定义格式 3.类的实例化 3.1什么是实例化 3.2类和对象的说明 4.this引用 4.1为什么要有this的引用 4.2什么是this引用 4.3this引用的特性 &#x1…

3 — NLP 中的标记化:分解文本数据的艺术

一、说明 这是一个系列文章的第三篇文章&#xff0c; 文章前半部分分别是&#xff1a; 1 — NLP 的文本预处理技术2 — NLP中的词干提取和词形还原&#xff1a;文本预处理技术 在本文中&#xff0c;我们将介绍标记化主题。在开始之前&#xff0c;我建议您阅读我之前介绍…

【机器学习合集】模型设计之注意力机制动态网络 ->(个人学习记录笔记)

文章目录 注意力机制1. 注意力机制及其应用1.1 注意力机制的定义1.2 注意力机制的典型应用 2. 注意力模型设计2.1 空间注意力机制2.2 空间注意力模型2.3 通道注意力机制2.4 空间与通道注意力机制2.5 自注意力机制2.5 级联attention 动态网络1. 动态网络的定义2. 基于丢弃策略的…

高校教务系统登录页面JS分析——西安电子科技大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍西安电子科技大学高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 &#x1f31f;PS&#xff1a;我还以为和…

Linux服务器使用GPU技巧

进行深度学习实验的时候用pytorch-gpu&#xff0c;经常要与GPU打交道&#xff1b; 所以经常遇到奇奇怪怪的问题&#xff1b; 查看GPU占用情况 watch -n 10 nvidia-smi 使用技巧 torch.nn.DataParallel() CLASStorch.nn.DataParallel(module, device_idsNone, output_devic…