ElasticSearch搜索详细讲解与操作

全文检索基础
全文检索流程
流程:

创建索引
返回结果
查询索引
原始文档
创建索引
索引库
查询索引
创建索引:

获取文档
构建文档对象
分析文档'分词'
创建索引
查询索引:

用户查询结构
创建查询
执行查询
渲染结果
相关概念
索引库
索引库就是存储索引的保存在磁盘上的一系列的文件。里面存储了建立好的索引消息以及文档对象。

** 一个索引库相当于数据库中的一张表,一个文档对象相当于数据库中的一行数据

doucument对象
获取原始内容的目的是为了索引,在索引前需要将原始内容建成文档,文档中包含一个一个的域(字段),域中存储内容。每个文档都有一个唯一的编号,就是文档id。

field对象
如果我们把document看作是数据库中的一条记录的话,field相当于是记录中的字段。field是索引库中存储数据的最小单位。field的数据类型大致可以分为数值类型和文本类型,一般需要查询的字段都是文本类型的,field还有如下属性:

是否分词:是否对域的内容进行分词处理。前提是我们对域的内容进行查询

是否索引:将Field分析后的词或整个Field值进行索引,只有索引方可搜索到

是否存储:Field值存储在文档中,存储在文档中的Field才可以从Document中获取

term对象
从文档对象中拆分出来的每个单词叫做term,不同域中拆分出来的相同的单词是不同term。term中包含两部分,一部分是文档的域名。另一部分是单词的内容。term是创建索引的关键词对象。

ElasticSearch相关概念
概述
ES是面对文档的,这意味这它可以存储整个对象或文档。然而它不仅仅是存储,还会索引每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。

ES比较传统关系型数据库如下:

Relational DB -> Databases->Tables->Rows ->Columns

ES->Indices->Types->Documents->Fields

ES核心概念
索引index
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。

类型type
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定,通常,会为具有一组共同字段文档定义一个类型。比如说,我们假设你运营一个博客平台

字段Field
相当于是字段表的字段,对文档数据根据不同属性进行的分类标识

映射mapping
mapping是处理数据的范式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的,其他就是处理es里面的数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。

文档document
一个文档是一个可被索引的基础消息单元。比如,你可以拥有某一个客户的文档,某个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON格式来表示,而JSON是一个到处存在的互联网数据交互格式

在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type

接近实时NRT
ES是一个接近实时的搜索平台,这意味这,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟

集群cluster
集群就是有一个或多个节点组织在一起,它们共同持有整个数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是es。这个名字是重要的,意味一个节点只能通过指定某个集群的名字来加入这个集群

节点node
一个节点是集群的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识,默认情况下,这个名字是一个随机的名字。

分片和复制 shards&replicas
一个索引可以存储超出单个节点硬件限制的大量数据。每个分片本身也是一个功能完善并且独立的索引,这个索引可以被放置到集群的任何节点上。分片很重要,主要有两方面:

1)允许你水平分割/扩展你的内容容量

2)允许你的分片(潜在地,位于多个节点上)之上进行分布式、并行的操作,进而提高性能/吞吐量

要复制的两个原因:在分片/节点失败的情况下,提高了高可用性。因为这个原因,主要到复制分片从不与原/主要分片置于同一节点上是非常重要的。扩展你的搜索量/吞吐量。因为搜索可以在所有的复制上并行运行。总之,每个索引可以被分成多个分片,一个索引也可以被复制0次或多次,一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你是不能改变分片的数量

安装
docker安装

sudo docker pull elasticsearch:5.6.8
1
启动

sudo docker run -id --name=zys_es -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8
1
注意:可能因为内存不够或者进程满等原因会中断es进程

安装包安装

sudo apt-get install openjdk-8-jdk #1、安装open-jdk
#2、官网查找需要的es版本 es官网:https://www.elastic.co/cn/downloads/elasticsearch
#点击【apt-get】
#查找自己想要的版本,点击使用deb方式安装
#安装es-7.6.2
1、wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-amd64.deb
2、wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-amd64.deb.sha512
3、shasum -a 512 -c elasticsearch-7.6.2-amd64.deb.sha512 
4、sudo dpkg -i elasticsearch-7.6.2-amd64.deb
#修改配置文件elasticsearch.yml
vi /etc/elasticsearch/elasticsearch.yml

{
node.name: node-1
network.host: 0.0.0.0 #允许外网访问
http.port: 9200 #指定es端口号
clauster.initial_master_nodes: ["node-1"]
}
#修改jvm.options
{
-Xms4g
-Xms4g
}
#启动es
sudo chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/  #目录的owner和group改成elasticsearch
systemctl enable elasticsearch.service    #设置es开机自启动
sudo systemctl start elasticsearch.service    #启动es
sudo systemctl stop elasticsearch.service    #停止es

#查看es运行状态
service elasticsearch status
#查看报错日志
tail -f /var/log/elasticsearch/elasticsearch.log
#检查是否运行正常
curl localhost:9200

# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址
http.cors.allow-origin: "*"
# 通过为 cluster.initial_master_nodes 参数设置符合主节点条件的节点的 IP 地址来引导启动集群
cluster.initial_master_nodes: ["node-1"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
ElasticSearch的客户端操作
三种方式:

第一种:elasticsearch-head操作

第二种:使用elasticsearch提供的Restful接口直接访问

第三种:使用es提供的API直接访问

elasticsearch-head
下载elasticsearch-head安装包
进入目录下打开cmd
npm install -g grunt-cli
启动
npm install
grunt server
1
2
3
4
5
6
Postman
创建索引index和映射Mapping
注意:elasticsearch7默认不在支持指定索引类型,默认索引类型是_doc,如果想改变,则配置include_type_name: true 即可(这个没有测试,官方文档说的,无论是否可行,建议不要这么做,因为elasticsearch8后就不在提供该字段)。官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html

7.x之前:

{
    "settings":{    
    "number_of_shards" : 3,   
    "number_of_replicas" : 0    
    },    
     "mappings":{    
      "books":{     //指定索引
        "properties":{        
            "title":{"type":"text"},
            "name":{"type":"text","index":false}, //有index
            "publish_date":{"type":"date","index":false},           
            "price":{"type":"double"},           
            "number":{
                "type":"object",
                "dynamic":true
            }
        }
      }
     }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
7.x之后:

{
  "settings":{
    "number_of_shards":3, #分片数量
    "number_of_replicas":2 #每个分片副本
  },
  "mappings":{
  //无索引
    "properties":{
      "id":{"type":"long"},
      "name":{"type":"text","analyzer":"standard"}, //无指定index为true或为false,standard为分词器的一种,standard一个汉字一个词
      "text":{"type":"text","analyzer":"ik_max_word"}
    }
  }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
创建索引后设置Mapping
http://120.78.130.50:9200/blog7/hello/mapping

{
    "properties":{
      "id":{"type":"long"},
      "name":{"type":"text","analyzer":"ik_smart"}, //无指定index为true或为false
      "text":{"type":"text","analyzer":"ik_max_word"}
    }
 
}
1
2
3
4
5
6
7
8
9
10
创建文档document
请求url:

post http://120.78.130.50:9200/blog1/_doc/1

请求体:

{
    "id":1,
    "name":"es是一个lucene的搜索服务器", 
    "text":"阿萨的贺卡收到萨拉DHL收到啦收到啦实打实的拉萨机的卡拉卡斯德拉夫拉上来就"
}
1
2
3
4
5
修改文档
请求url:

post http://120.78.130.50:9200/blog1/_doc/1

请求体:

{
    "id":1,
    "name":"es是一个lucene的搜索服务器反对犯得上", 
    "text":"阿萨的贺卡收到萨拉DHL收到啦收到啦实打实的拉萨机的卡拉卡斯德拉夫拉上来就"
}
1
2
3
4
5
文档删除document
delete http://120.78.130.50:9200/blog1/_doc/1

根据id查询文档
GET http://120.78.130.50:9200/blog1/_doc/2

结果

{
    "_index": "blog1", //索引名称
    "_type": "_doc", //索引类型
    "_id": "2", 
    "_version": 1,
    "_seq_no": 2,
    "_primary_term": 1,
    "found": true,
    "_source": { //数据
        "id": 1,
        "name": "es是一个lucene的搜索服务器", //无指定index为true或为false
        "text": "阿萨的贺卡收到萨拉DHL收到啦收到啦实打实的拉萨机的卡拉卡斯德拉夫拉上来就"
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
查询文档-querystring查询
url:

POST http://120.78.130.50:9200/blog1/_doc/_search

请求体:

{
    "query": {
        "query_string": {
            "default_field": "name",
            "query": "搜索服务器"
        }
    }
}
1
2
3
4
5
6
7
8
钢索->“钢”,“索”,搜索是分为两个词,注意Standard标准分词器,会把汉字每个字分为一个词存到索引库中的name,也就是按照Standard进行的分词,所以搜索钢索能搜到这个document

查询文档-term查询
url:

POST http://120.78.130.50:9200/blog1/_doc/_search

body

{
    "query": {
        "term": {
            "name": "搜索"
        }
    }
}
1
2
3
4
5
6
7
query_string :搜索之前对搜索的关键词分词

term:对搜索的关键词不分词

IK分词器
安装

下载安装包 :https://github.com/medcl/elasticsearch-analysis-ik/releases

放到/ usr/share/elasticsearch/plugins

重启es

7.x之前测试:

http://120.78.130.50:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员

http://120.78.130.50:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员

7.x之后测试:url+body

http://120.78.130.50:9200/_analyze

{

“analyzer”: “ik_smart”,

“text”: “我是傻逼”

}

注意:

​ ik_smart:会做最粗粒度的拆分

​ ik_max_word: 会将文本做最细粒度的拆分

注意出错:将ik解压成功后es可能就启动不了,可能是ik中所有文件的用户组和所有者属于root,需要改成当前的用户组和所有者,用

sudo chmod zys_ergou ./ik/*

sudo chown zys_ergou ./ik/*

还有一种情况就是es和ik的版本不兼容,需要进入plugin-descriptor.properties文件更改es的version

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

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

相关文章

在 uniapp 中 一键转换单位 (px 转 rpx)

在 uniapp 中 一键转换单位 px 转 rpx Uni-app 官方转换位置利用【px2rpx】插件Ctrl S一键全部转换下载插件修改插件 Uni-app 官方转换位置 首先在App.vue中输入这个: uni.getSystemInfo({success(res) {console.log("屏幕宽度", res.screenWidth) //屏…

酷柚易汛ERP - 商品库存余额表操作指南

1、应用场景 商品库存余额表用于查询商品在各仓库的实际结存量、单位成本以及成本等明细。 2、主要操作 打开【仓库】-【商品库存余额表】,可筛选仓库、商品、商品类别,导出/打印等操作见【销货单】不再赘述。 3、分享操作 库存余额分享,…

CCLink转Modbus TCP网关_MODBUS网口设置

兴达易控CCLink转Modbus TCP网关是一种用于连接CCLink网络和Modbus TCP网络的设备。它提供了简单易用的MODBUS网口设置,可以帮助用户轻松地配置和管理网络连接 1 、网关做为MODBUS主站 (1)将电脑用网线连接至网关的P3网口上。 (…

计算机网络(一)

一、什么是计算机网络、计算机协议? 计算机网络就是由计算机作为收发端,不同计算机相互连接的网络,包括互联网(Internet),公司或者家用网络(intranet)等等;其中Internet…

【C语言 | 指针】C指针详解(经典,非常详细)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

【数据结构】非递归实现二叉树的前 + 中 + 后 + 层序遍历(听说面试会考?)

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&…

利用角色roles上线wordpress项目

角色订制:roles ① 简介 对于以上所有的方式有个弊端就是无法实现复用假设在同时部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个yml文件。很难实现灵活的调用。   roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文…

CentOS7、CentOS8 如何修改ip信息(修改网络信息)(无图形界面)(亲测可用)

文章目录 CentOS 7方法一:使用 nmcli 命令方法二:编辑配置文件(我的CentOS7是使用这种方法,亲测可用) CentOS 8方法一:使用 nmcli 命令方法二:编辑配置文件 在 CentOS 系统中,如果你…

详解JS的四种异步解决方案:回调函数、Promise、Generator、async/await

同步&异步的概念 在讲这四种异步方案之前,我们先来明确一下同步和异步的概念: 所谓同步(synchronization),简单来说,就是顺序执行,指的是同一时间只能做一件事情,只有目前正在执行的事情做完之后&am…

Halcon WPF 开发学习笔记(2):Halcon导出c#脚本和WPF初步开发

文章目录 前言HalconC#教学简单说明如何二开机器视觉如何二次开发Halcon导出Halcon脚本新建WPF项目,导入Halcon脚本和Halcon命名空间 前言 我目前搜了一下我了解的机器视觉软件,有如下特点 优点缺点兼容性教学视频(B站前三播放量)OpenCV开源&#xff0…

Vue 组件化编程 和 生命周期

目录 一、组件化编程 1.基本介绍 : 2.原理示意图 : 3.全局组件示例 : 4.局部组件示例 : 5.全局组件和局部组件的区别 : 二、生命周期 1.基本介绍 : 2.生命周期示意图 : 3.实例测试 : 一、组件化编程 1.基本介绍 : (1) 开发大型应用的时候,页面往往划分成…

Flink之Java Table API的使用

Java Table API的使用 使用Java Table API开发添加依赖创建表环境创建表查询表输出表使用示例 表和流的转换流DataStream转换成表Table表Table转换成流DataStream示例数据类型 自定义函数UDF标量函数表函数聚合函数表聚合函数 API方法汇总基本方法列操作聚合操作Joins合并操作排…

智能优化算法(一):伪随机数的产生

文章目录 1.伪随机数介绍1.1.伪随机产生的意义1.2.伪随机产生的过程 2.产生U(0,1)的乘除同余法2.1.原始的乘同余法2.2.改进的乘同余法 3.产生正态分布的伪随机数4.基于逆变法产生伪随机数 1.伪随机数介绍 1.1.伪随机产生的意义 1.随机数的产生是进行随机优化的第一步也是最重要…

Qt QTableWidget表格的宽度

本文归属于 Qt实验室-CSDN博客 系列文章 默认值 QTableWIdget的表格宽度默认是一个给定值,可以手动调整每列的宽度,也不填满父窗口 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(800,600);QStringList contents{&q…

2023.11-9 hive数据仓库,概念,架构,元数据管理模式

目录 0.数据仓库和数据库 数据仓库和数据库的区别 数据仓库基础三层架构 一.HDFS、HBase、Hive的区别 二.大数据相关软件 三. Hive 的优缺点 1)优点 2)缺点 四. Hive 和数据库比较 1)查询语言 2)数据更新 3)…

《视觉SLAM十四讲》-- 相机与图像

04 相机与图像 4.1 相机模型 4.1.1 针孔相机模型 针孔模型描述了一束光线通过针孔后,在针孔背面投影成像的关系(类似小孔成像原理)。 根据相似三角关系 Z f − X X ′ − Y Y ′ (3-1) \frac{Z}{f}-\frac{X}{X^{\prime}}-\frac{Y}{Y^{\p…

UART学习

uart.c #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h" // UART4_TX : PG11 AF6 // UART4_RX : PB2 AF8 void __uart_init() {// GPIOB2 设置为复用功能GPIOB->MODER & (~(0x3 << 4));GPIOB->MODER | (0x2 << 4);G…

5.图层控制器(DefaultOverlayManager)

愿你出走半生,归来仍是少年&#xff01; 图层控制器用于操作在MapView中的图层。 1.图层新增 voidadd(int pIndex, Overlay pElement)List<Overlay>overlays() 通过add方法可向MapView中新增一个图层&#xff0c;并指定其顺序。或者通过获取其图层的List,进行操作新增。…

算法与数据结构--前缀和

一维前缀和适用于计算某个一维数列某个数到某个数之间的累加和&#xff08;或者乘积&#xff0c;又或者异或和&#xff09;之类的。 比如计算某个一维度数列从i到j之间元素的和。最开始的想法就是从i遍历到j&#xff0c;将这之间的元素相加。但是当查询次数很多时候&#xff0…

基于DBO算法的WSN节点覆盖优化

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…