分布式搜索--elasticsearch

一、初识 elasticsearch 

1. 了解 ES

① elasticsearch 是一款非常强大的开源

  搜索引擎,可以帮助我们从海量数据中

  快速找到需要的内容

② elasticsearch 结合 kibana、Logstash、

  Beats,也就是 elastic stack (ELK),被

  广泛应用在日志数据分析、实时监控等

  领域

③ elasticsearch 是elastic stack的核心,

   负责存储、搜索、分析数据

 (2) Lucene 与 elasticsearch 的区别

Lucene 是一个Java语言的搜索引擎类库

Lucene的优势:

① 易扩展

② 高性能 (基于倒排索引)

 Lucene的缺点:

① 只限于 Java 语言开发

② 学习曲线陡峭

③ 不支持水平扩展

相比于 lucene,elasticsearch 具备下列

优势:

① 支持分布式,可水平扩展

② 提供 Restful 接口,可被任何语言

    调用  

2. 倒排索引

传统数据库 (如MySQL) 采用正向索引

局部搜索会在表上逐条数据进行扫描,

非常的繁琐

elasticsearch 采用倒排索引

会形成一个新的表,由两部分构成,进

行两次搜索,先搜词条再搜文档

文档 (document):每条数据就是一个文档

词条 (term):文档按照语义分成的词语

 

倒排索引中包含两部分内容:

词条词典 (Term Dictionary):记录所有词条,

以及词条与倒排列表 (Posting List) 之间的关

系,会给词条创建索引,提高查询和插入效

倒排列表 (Posting List):记录词条所在的文

档 id、词条出现频率 、词条在文档中的位置

等信息

        文档 id:用于快速获取文档

        词条频率 (TF):文档在词条出现的次数

                                 用于评分 

3. es 的一些概念

(1) es 与 mysql 对比

(2) 架构

Mysql:擅长事务类型操作,可以确保

             数据的安全和一致性

Elasticsearch:擅长海量数据的搜索、

                         分析、计算

4. 安装 es、kibana

(1) 部署单点 es

(2) 部署 kibana

kibana 可以提供一个 elasticsearch 的

视化界面

(3) 安装 IK 分词器

  1) 分词器的作用

创建倒排索引时对文档分词

② 用户搜索时,对输入的内容分词

  2) 默认的分词语法说明:

在 kibana 的 DevTools 中测试:

POST /_analyze
{"analyzer": "standard","text": "床前明月光,疑是地上霜!"
}

POST:请求方式

/_analyze:请求路径,这里省略了,

                       有 kibana 帮我们补充

③ 请求参数,json风格:

        analyzer:分词器类型,这里是默

                         认的 standard 分词器

        text:要分词的内容 

默认将文字拆除一个字一个字的,对中

文分词很不友好,所以用 IK 分词器

  3) ik 分词器包含两种模式:

ik_smart:最少切分,粗粒度

ik_max_word:最细切分,细粒度 

一般情况下,为了提高搜索的效果,

需要这两种分词器配合使用,既建

索引时用 ik_max_word 尽可能多的

分词,而搜索时用 ik_smart 尽可能

提高匹配准度,让用户的搜索尽可

能的准确

   4) ik 分词器扩展词条

要拓展ik分词器的词库,只需要修改一

个 ik 分词器目录中的 config 目录中的

IkAnalyzer.cfg.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典--><entry key="ext_dict">ext.dic</entry>
</properties>

然后在名为 ext.dic 的文件中,添加想要

拓展的词语即可

  5) 停用词条

stopword.dic 文件中,添加想要拓展的

词语即可:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典--><entry key="ext_dict">ext.dic</entry><!--用户可以在这里配置自己的扩展停止词字典  *** 添加停用词词典--><entry key="ext_stopwords">stopword.dic</entry>
</properties>

(4) 部署 es 集群

直接使用 docker-compose 来完成

二、索引库操作

1. mapping 映射属性

(1) mapping 是对索引库中文档的约束,常

    见的 mapping 属性包括:

type:字段数据类型,常见的简单类型有:

字符串:text (可分词的文本)、keyword

   (精确值,例如:品牌、国家、ip 地址)

数值:long、integer、short、byte、

           double、float

布尔:boolean

日期:date

对象:object

index:是否创建索引,默认为 true

analyzer:使用哪种分词器

properties:该字段的子字段

2. 索引库的 CRUD

(1) 创建索引库

ES 中通过 Restful 请求操作索引库、

文档,请求内容用 DSL 语句来表示

创建索引库和 mapping 的 DSL 语法如下:

PUT /索引库名称

PUT /索引库名称
{"mappings": {"properties": {"字段名":{"type": "text","analyzer": "ik_smart"},"字段名2":{"type": "keyword","index": "false"},"字段名3":{"properties": {"子字段": {"type": "keyword"}}},// ...略}}
}

(2) 查看索引库

GET /索引库名

(3) 修改索引库

索引库和 mapping 一旦创建无法修改

但是可以添加新的字段,语法如下:

PUT /索引库名/_mapping

PUT /索引库名/_mapping
{"properties": {"新字段名":{"type": "integer"}}
}

(4) 删除索引库

DELETE /索引库名

三、文档操作

1. 新增文档

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

POST /索引库名/_doc/文档id
{"字段1": "值1","字段2": "值2","字段3": {"子属性1": "值3","子属性2": "值4"},// ...
}

2. 查询文档

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

3. 删除文档

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

4. 修改文档

(1) 全量修改

删除旧文档,添加新文档

本质是:根据指定的 id 删除文档,新增

              一个相同 id 的文档

PUT /{索引库名}/_doc/文档id
{"字段1": "值1","字段2": "值2",// ... 略
}

(2) 增量修改

修改指定字段值

POST /{索引库名}/_update/文档id
{"doc": {"字段名": "新的值",}
}

5. Dynamic Mapping

我们向 ES 中插入文档时,如果文档中

字段没有对应的 mapping,ES 会帮助

我们字段设置 mapping

JSON类型Elasticsearch类型
字符串

① 日期格式字符串:mapping 为 date 类型

② 普通字符串:mapping 为 text 类型,并添加

     keyword 类型子字段

布尔值boolean
浮点数float
整数long
对象嵌套object,并添加 properties
数组由数组中的第一个非空类型决定
空值忽略

四、RestClient 操作索引库

RESTClient 是一款用于测试各种 Web

服务的插件,它可以向服务器发送各种

HTTP请求(用户也可以自定义请求方式),

并显示服务器响应

本质就是组装 DSL 语句,通过 http请求

发送给 ES

1. 创建索引库

(1) 导入数据库

(2) 分析数据结构

mapping 要考虑的问题:

字段名、数据类型、是否参与搜索、是

否分词,如果分词,分词器是什么

(3) 初始化 JavaRestClient

① 引入依赖

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

② 初始化

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.150.101:9200")
));

(4) 创建索引库代码

@Testvoid testCreateHotelIndex() throws IOException {// 1.创建Request对象CreateIndexRequest request = new CreateIndexRequest("hotel");// 2.请求参数,MAPPING_TEMPLATE是静态常量字符串,内容是创建索引库的DSL语句      request.source(MAPPING_TEMPLATE, XContentType.JSON);// 3.发起请求, indices 返回的对象中包含索引库操作的所有方法client.indices().create(request, RequestOptions.DEFAULT);
}

2. 删除索引库代码

@Test
void testDeleteHotelIndex() throws IOException {// 1.创建Request对象DeleteIndexRequest request = new DeleteIndexRequest("hotel");// 2.发起请求client.indices().delete(request, RequestOptions.DEFAULT);
}

3. 判断索引库是否存在

@Test
void testExistsHotelIndex() throws IOException {// 1.创建Request对象GetIndexRequest request = new GetIndexRequest("hotel");// 2.发起请求 boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 3.输出System.out.println(exists);
}

五、RestClient 操作文档

1. 初始化

public class ElasticsearchDocumentTest {   // 客户端private RestHighLevelClient client;@BeforeEachvoid setUp() {client = new RestHighLevelClient(RestClient.builder(                       HttpHost.create("http://192.168.150.101:9200")));}@AfterEachvoid tearDown() throws IOException {client.close();}
}

2. 新增文档

@Test
void testIndexDocument() throws IOException {// 1.创建request对象IndexRequest request = new IndexRequest("indexName").id("1");// 2.准备JSON文档request.source("{\"name\": \"Jack\", \"age\": 21}", XContentType.JSON);// 3.发送请求client.index(request, RequestOptions.DEFAULT);
}

3. 查询文档

@Test
void testGetDocumentById() throws IOException {// 1.创建request对象GetRequest request = new GetRequest("indexName", "1");// 2.发送请求,得到结果GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.解析结果String json = response.getSourceAsString();System.out.println(json);
}

4. 修改文档

@Test
void testUpdateDocumentById() throws IOException {// 1.创建request对象UpdateRequest request = new UpdateRequest("indexName", "1");// 2.准备参数,每2个参数为一对 key valuerequest.doc("age", 18,"name", "Rose");// 3.更新文档client.update(request, RequestOptions.DEFAULT);
}

5. 删除文档

@Test
void testDeleteDocumentById() throws IOException {// 1.创建request对象DeleteRequest request = new DeleteRequest("indexName", "1");// 2.删除文档 client.delete(request, RequestOptions.DEFAULT);
}

6. 批量导入文档

@Test
void testBulk() throws IOException {// 1.创建Bulk请求BulkRequest request = new BulkRequest();// 2.添加要批量提交的请求:这里添加了两个新增文档的请求request.add(new IndexRequest("hotel").id("101").source("json source", XContentType.JSON));request.add(new IndexRequest("hotel").id("102").source("json source2", XContentType.JSON));// 3.发起bulk请求client.bulk(request, RequestOptions.DEFAULT);
}

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

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

相关文章

架构师日记-到底该如何搭建一个新系统 | 京东云技术团队

一 前言 架构设计按照实施过程可分为工程架构&#xff0c;业务架构&#xff0c;部署架构等多个维度&#xff0c;一个好的系统架构标准应该具备可扩展、可维护、可靠性、安全性和高性能等特点。尽管这些特点大家都熟知&#xff0c;但在实际落地时&#xff0c;我们更为迫切的想知…

pytorch线性模型 学习前要学习的基础知识

跟着刘二大人学pytorch&#xff0c;补全一下我的基础缺失 1.numpy基础 import numpy as np from PIL import Image anp.array([1,2,3]) #生成一维数组 print(a) bnp.arange(1,4)#创建等差数组&#xff0c;默认等差是1&#xff0c;数组为1&#xff0c;2&#xff0c;3&#xff0…

Efficient Methods for Non-stationary Online Learning

Dynamic regret Adaptive regret 假设&#xff1a; 算法过程&#xff1a; Regret分析

D. Pairs of Segments

Problem - D - Codeforces 思路&#xff1a;其实它求的就是不相交区间的最大数量&#xff0c;但是它的区间是两个区间合并得到&#xff0c;所以我们可以直接将所有能合并的区间直接合并&#xff0c;然后做一遍不相交区间的最大数量&#xff0c;这样存在一种问题就是一个区间会不…

SolidWorks二次开发-BOM球标和材料表

目标先到100&#xff0c;实在没什么好写的了&#xff0c;先把这两个简单的功能列一下吧。 private void btnInsertBalloon_Click(object sender, EventArgs e){//插入对应的BOM气泡球 球标//操作步骤->选中视图&#xff0c;执行自动球标命令SldWorks swApp Utility.Conne…

Flowable边界事件-定时边界事件

定时边界事件 定时边界事件一、定义1. 图形标记2. 完整的流程图3. XML标记 二、测试用例2.1 定时边界事件xml文件2.2 定时边界事件测试用例 总结 定时边界事件 一、定义 时间达到设定的时间之后触发事件 由于定时边界事件和开始定时事件几乎差不多&#xff0c;四种情况我就不一…

linux入门练级篇 第三讲 基本指令3

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

揭秘Dalio全天候策略:基于中美市场ETF的量化回测

01 引言 Ray Dalio 是全球最大的对冲基金——桥水联合基金&#xff08;Bridgewater Associates&#xff09;的创始人和首席投资官&#xff0c;其投资哲学在金融界中广为人知。他开创了一种被称为"全天候策略"&#xff08;All Weather Strategy&#xff09;的投资策略…

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

1. 效果图 2. 组件完整代码 <template><view class="custom-picker"><view :class=<

mybatis 注解方式操作 sql

前言:注解的方式在某些查询的时候还是比较方便的 mybatis注解配置 mapUnderscoreToCamelCase 配置Select 注解Insert 注解Delete 注解 和 Update 注解Provider 注解 mapUnderscoreToCamelCase 配置 别名设置&#xff0c;mapUnderscoreToCamelCase 配置 配置可以将 带下划线 sq…

AtcoderABC309场

A - NineA - Nine 题目大意 判断两个数是否相邻且水平排列&#xff0c;即它们在同一行并且相邻。可以直接打印或者找规律 思路分析 可以直接打印或者找规律 时间复杂度 O&#xff08;1&#xff09; 代码 #include<bits/stdc.h> using namespace std; int main(){i…

LeetCode 打卡day59--单调栈

一个人的朝圣 — LeetCode打卡第59-60天 知识总结 Leetcode 739. 每日温度题目说明代码说明 Leetcode 496. 下一个更大元素 I题目说明代码说明 Leetcode 84. 柱状图中最大的矩形题目说明代码说明 知识总结 今天做了单调栈的三道题 总结了一个模版套路: 寻找下一个更大的数 f…