分布式搜索--elasticsearch

news2024/11/14 2:07:29

一、初识 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;

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

    @AfterEach
    void 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 value
    request.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.coloradmin.cn/o/728380.html

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

相关文章

【CANoe示例分析】PythonCAPL_Call_Demo

该工程由Vector官方提供,目的是演示Python如何调用CAPL文件里的自定义函数。里面除了CANoe工程文件外,还有python文件和CAPL: 提供了两种CANoe版本的工程文件,选择其中一种打开即可。 首先我们要确定CAPL文件AnalyseFunctions.can在CANoe工程内的什么地方?首先想到的是Si…

Apache Doris 在金融壹账通指标中台的应用实践

本文导读&#xff1a; 金融壹账通作为中国平安集团的联营公司&#xff0c;依托平安集团 30 多年金融行业的丰富经验及自主科研能力&#xff0c;向客户提供“横向一体化、纵向全覆盖”的整合产品&#xff0c;以“技术业务”为独特竞争力&#xff0c;帮助客户提升效率、提升服务…

vuex中的四个map方法的使用

vuex中的四个map方法的使用 vuex里面有四个map方法&#xff0c;他们分别可以针对不同的元素进行不同的代码生成 这四个map方法都是异曲同工&#xff0c;明白了一个基本上都明白了 1 编写案例 现在想要展示一段文本&#xff0c;其中里面两个参数要存在store的state里面&…

怎样优雅地增删查改(二):扩展身份管理模块

文章目录 用户关系管理扩展组织管理功能创建可查询仓储 实现控制器测试接口 身份管理模块&#xff08;Identity模块&#xff09;为通用查询接口的按组织架构查询和按户关系查询提供查询依据。 身份管理模块的领域层依赖Volo.Abp.Identity.Domain Abp为我们实现了一套身份管理模…

CentOS 7镜像下载 以及 DVD ISO 和 Minimal ISO 等各版本的区别介绍

1.官网下载 官网下载地址&#xff1a;官网下载链接 点击进入下载页面&#xff0c;随便选择一个下载即可&#xff08;不推荐&#xff0c;推荐阿里云下载&#xff0c;见下文&#xff09; 阿里云下载站点&#xff08;速度非常快推荐&#xff09; 阿里云下载链接&#xff1a; http…

免费下载!10个3D素材网站推荐

在设计工作中&#xff0c;3D素材可以帮助设计师创建高质量的UI设计&#xff0c;提高设计效率和准确性。本文将为您推荐10个好用的3D素材网站&#xff0c;助力设计师实现高效创作。 1.即时设计资源广场 即时设计资源广场是一个致力于为设计师提供丰富多样的设计资产和灵感的社…

chatgpt 与传统3D建模对比分析

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链 随着人工智能技术的发展&#xff0c;越来越多的领域正逐渐被AI模型所取代。ChatGPT作为一种自然语言处理技术&#xff0c;越来越为人们所熟悉。最近&#xff0c;一些3D建模领域的专家想知道ChatGPT是否可以取代传统的手动3D建…

ClickHouse主键索引最佳实践

在本文中&#xff0c;我们将深入研究ClickHouse索引。我们将对此进行详细说明和讨论&#xff1a; ClickHouse的索引与传统的关系数据库有何不同ClickHouse是怎样构建和使用主键稀疏索引的ClickHouse索引的最佳实践 您可以选择在自己的机器上执行本文给出的所有Clickhouse SQL…

C++之Clang属性大全(一百五十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

NC65自由报表参数设置后,报表发布成节点后,点击查询,在查询框输入条件后,参数值没有拼接到sql中的解决方法

NC65自由报表参数设置后&#xff0c;报表发布成节点后&#xff0c;点击查询&#xff0c;在查询框输入条件后&#xff0c;参数值没有拼接到sql中的解决方法 在语义分析模型中把sql语句放进去&#xff0c;把字段和查询查询设置好 语义模型的sql使用了parameter把参数输入 sel…

eNSP-OSPF组播拓展复杂区域连接

OSPF动态路由 文章目录 OSPF动态路由一、题目要求二、题目分析三、拓扑结构四、基础配置五、测试验证 一、题目要求 1 、 使用172.16.0.0.0/16网段进行子网划分 2 、 用OSPF协议达到全网可达 3 、 保证所有设备均具备最少的 LSDB 以及路由表 二、题目分析 1.网段划分 5个O…

将OxyPlot封装成用户控件后在WPF中的应用

1、文件架构 2、加载依赖项 Newtonsoft.Json OxyPlot.Wpf 3、NotifyBase.cs namespace Accurate.Common {public class NotifyBase : INotifyPropertyChanged{public event PropertyChangedEventHandler? PropertyChanged;public void DoNotify([CallerMemberName] string p…

【深度学习】日常笔记10

loss_fn nn.MSELoss(reductionnone)这行代码&#xff0c;在这个上下文中&#xff0c;loss_fn实际上是一个损失函数对象而不是返回的具体值。 使用nn.MSELoss(reductionnone)创建的loss_fn是一个均方误差损失函数对象&#xff0c;而不是计算后的结果。要计算具体的损失值&…

(02)Cartographer源码无死角解析-(79) ROS服务→子图压缩与服务发送

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

一篇文章带你吃透Go语言的Atomic和Channel--实战方法

一篇文章带你吃透Go语言的Atomic和Channel–实战方法 Atomic 要保证原子操作&#xff0c;一定要使用这几种方法 我们在学习 Mutex、RWMutex 等并发原语的实现时&#xff0c;你可以看到&#xff0c;最底层是通过 atomic 包中的一些原子操作来实现的 你可能会说&#xff0c;这些…

C语言中级篇请看另一篇文章,这一篇文章只写给高手看【高阶C语言】【更新中】【原创】

文章目录 前言define和typedef的区别?前言 关于C语言,博主已经写了不少的笔记总结了,C语言基础版可看我的专栏里面的C语言精华,C语言进阶版可看我的谭浩强C语言第五版,C语言高阶版看此篇文章即可 C Primer Plus书籍,C语言精华,截图 + 代码 + 学习总结笔记【11000字】【…

AOCVSBOCV、AOCV table

文章目录 AOCV&#xff08;Advanced OCV&#xff09;&SBOCV&#xff08;Stage Based OCV&#xff09;---更精确&#xff0c;剔除悲观度Random variation&#xff08;Depth/Stage based AOCV&#xff09;Systematic variation&#xff08;Distance based AOCV&#xff09;一…

阻塞队列是什么

1、阻塞队列是什么? (1) 栈与队列 1&#xff09;栈&#xff1a;先进后出&#xff0c;后进先出 2&#xff09;队列&#xff1a;先进先出 (2) 阻塞队列 阻塞&#xff1a;必须要阻塞/不得不阻塞 阻塞队列是一个队列&#xff0c;在数据结构中起的作用如下图&#xff1a; 线程1…

直播美颜工具与实时美颜SDK开发指南

近年来&#xff0c;随着直播行业的蓬勃发展&#xff0c;越来越多的用户开始关注直播内容的质量。其中&#xff0c;美颜功能成为直播平台上不可或缺的一项特色功能。下文小编将从基础原理到实际应用&#xff0c;帮助开发者更好地实现高效又自然的美颜效果。 一、背景 在直播过…

spring之ApplicationContext

spring之ApplicationContext ApplicationContextApplicationContext源码ApplicationContext继承接口分析ApplicationContext两个比较重要的实现类AnnotationConfigApplicationContextClassPathXmlApplicationContext 国际化---MessageSource资源加载---ResourceLoader获取运行时…