ElasticSearch 查询实践(下)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ElasticSearch 查询实践

四.核心类型(Core datatype)


  • 字符串:string,string类型包含 text 和 keyword。


  • text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合。


  • keyword:该类型不能分词,可以被用来检索过滤、排序和聚合,keyword类型不可用text进行分词模糊检索。


  • 数值型:long、integer、short、byte、double、float


  • 日期型:date


  • 布尔型:boolean

五.keyword 与 text 映射类型的区别


将 book 字段设置为 keyword 映射 (只能精准查询, 不能分词查询,能聚合、

排序)


POST /es_db/_doc/_search 
{ 
"query": { 
"term": { 
"book": "elasticSearch入门至精通" } 
} 
} 
# 返回数据
#! Deprecation: [types removal] Specifying types in search requests is deprecated.
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}


将 book 字段设置为 text 映射能模糊查询, 能分词查询,不能聚合、排序)


POST /es_db/_doc/_search 
{ 
"query": { 
"match": { 
"book": "elasticSearch入门至精通" 
} 
} 
} 
# 返回数据
#! Deprecation: [types removal] Specifying types in search requests is deprecated.
{
  "took" : 12,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.7260926,
    "hits" : [
      {
        "_index" : "es_db",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.7260926,
        "_source" : {
          "name" : "Jack",
          "sex" : 1,
          "age" : 25,
          "book" : "elasticSearch入门至精通",
          "address" : "广州车陂"
        }
      }
    ]
  }
}

六.创建静态映射时指定text类型的ik分词器

1.设置ik分词器的文档映射


先删除之前的es_db

再创建新的es_db

定义ik_smart的映射


PUT /es_db 
{ 
"mappings":{ 
"properties":{ 
"name":{"type":"keyword","index":true,"store":true}, 
"sex":{"type":"integer","index":true,"store":true}, 
"age":{"type":"integer","index":true,"store":true}, 
"book":{"type":"text","index":true,"store":true,"analyzer":"ik_smart","search_analyzer":"ik_smart"}, 
"address":{"type":"text","index":true,"store":true} 
} 
} 
}
# 返回
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "es_db"
}

2.分词查询


POST /es_db/_doc/_search 
{"query": { 
"match": {"address": "广"} 
} 
} 
# 返回
#! Deprecation: [types removal] Specifying types in search requests is deprecated.
{
  "took" : 81,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}
POST /es_db/_doc/_search 
{ 
"query": { 
"match": {"address": "广州"} 
} 
} 
# 返回
#! Deprecation: [types removal] Specifying types in search requests is deprecated.
{
  "took" : 81,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

七.对已存在的mapping映射进行修改


具体方法


1)如果要推倒现有的映射, 你得重新建立一个静态索引


2)然后把之前索引里的数据导入到新的索引里


3)删除原创建的索引


4)为新索引起个别名, 为原索引名


PUT /db_index
POST _reindex 
{ 
"source": { 
"index": "db_index" 
}, 
"dest": { 
"index": "db_index_2" 
} 
} 
DELETE /db_index 
PUT /db_index_2/_alias/db_index


注意: 通过这几个步骤就实现了索引的平滑过渡,并且是零停机


八.Elasticsearch乐观并发控制


在数据库领域中,有两种方法来确保并发更新,不会丢失数据:


1、悲观并发控制


这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问

资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放

置锁的线程能够对这行数据进行修改。


2、乐观并发控制


Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在

尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接

下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关

情况报告给用户。


3、再以创建一个文档为例 ES老版本


PUT /db_index/_doc/1 
{ 
"name": "Jack", 
"sex": 1, 
"age": 25, 
"book": "Spring Boot 入门到精通", 
"remark": "hello world" 
} 

4、实现_version乐观锁更新文档


备注:es 7.x 不支持该关键字


PUT /db_index/_doc/1?version=1 
{ 
"name": "Jack", 
"sex": 1, 
"age": 25, 
"book": "Spring Boot 入门到精通", 
"remark": "hello world" 
}
# 返回
{
  "error" : {
    "root_cause" : [
      {
        "type" : "action_request_validation_exception",
        "reason" : "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;"
      }
    ],
    "type" : "action_request_validation_exception",
    "reason" : "Validation Failed: 1: internal versioning can not be used for optimistic concurrency control. Please use `if_seq_no` and `if_primary_term` instead;"
  },
  "status" : 400
}

5、ES新版本不使用version进行并发版本控制

if_seq_no=版本值


  • &if_primary_term=文档位置


  • _seq_no:文档版本号,作用同_version


  • _primary_term:文档所在位置


POST /my_doc/_search 
DELETE /my_doc 
POST /my_doc/_doc/1 
{ 
 "id": 1, 
 "name": "关羽", 
 "desc": "千里走单骑", 
 "create_date": "2021‐02‐24" 
 } 
 POST /my_doc/_update/1 
 { 
 "doc": { 
 "name": "关羽1" 
 } 
 } 
# if_seq_no 是版本号的意思,一个版本号只能被使用一次
POST /my_doc/_update/1/?if_seq_no=1&if_primary_term=1 
{ 
"doc": { 
"name": "关羽1" 
} 
} 
POST /my_doc/_update/1/?if_seq_no=2&if_primary_term=1 
{ 
"doc": { 
"name": "关羽2" 
} 
} 

九.Java API操作ES


后续独立文章讲解


十.ES集群环境搭建

1.将安装包分发到其他服务器上面

2.修改elasticsearch.yml


node1.hxl.cn 服务器使用hxl用户来修改配置文件


mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/log 
mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/data 
cd /usr/local/es/elasticsearch‐7.10.1/config 
rm ‐rf elasticsearch.yml 
vim elasticsearch.yml 
cluster.name: hxl‐es 
node.name: node1.hxl.cn 
path.data: /usr/local/es/elasticsearch‐7.10.1/data 
path.logs: /usr/local/es/elasticsearch‐7.10.1/log 
network.host: node1.hxl.cn 
http.port: 9200 
discovery.seed_hosts: ["IP1", "IP2", "IP3"] 
cluster.initial_master_nodes: ["节点1名称", "节点2名称", "节点3名称"] 
bootstrap.system_call_filter: false 
bootstrap.memory_lock: false 
http.cors.enabled: true 
http.cors.allow‐origin: "*" 

3.修改jvm.option


修改jvm.option配置文件,调整jvm堆内存大小


node1.hxl.cn使用hxl用户执行以下命令调整jvm堆内存大小,每个人根据自

己服务器的内存大小来进行调整。


cd /usr/local/es/elasticsearch‐7.10.1/config 
vim jvm.options 
‐Xms2g
‐Xmx2g 

4.node2与node3修改es配置文件


node2.hxl.cn与node3.hxl.cn也需要修改es配置文件


node2.hxl.cn使用hxl用户执行以下命令修改es配置文件


mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/log 
mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/data 
cd /usr/local/es/elasticsearch‐7.10.1/config 
vim elasticsearch.yml 
cluster.name: hxl‐es
node.name: node2.hxl.cn 
path.data: /usr/local/es/elasticsearch‐7.10.1/data 
path.logs: /usr/local/es/elasticsearch‐7.10.1/log 
network.host: node2.hxl.cn 
http.port: 9200 
discovery.seed_hosts: ["IP1", "IP2", "IP3"] 
cluster.initial_master_nodes: ["节点1名称", "节点2名称", "节点3名称"] 
bootstrap.system_call_filter: false 
bootstrap.memory_lock: false 
http.cors.enabled: true 
http.cors.allow‐origin: "*"


node3.hxl.cn使用hxl用户执行以下命令修改配置文件


mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/log 
mkdir ‐p /usr/local/es/elasticsearch‐7.10.1/data 
cd /usr/local/es/elasticsearch‐7.10.1/config 
vim elasticsearch.yml 
cluster.name: hxl‐es 
node.name: node3.hxl.cn10 
path.data: /usr/local/es/elasticsearch‐7.10.1/data 
path.logs: /usr/local/es/elasticsearch‐7.10.1/log 
network.host: node3.hxl.cn 
http.port: 9200 
discovery.seed_hosts: ["IP1", "IP2", "IP3"] 
cluster.initial_master_nodes: ["节点1名称", "节点2名称", "节点3名称"] 
bootstrap.system_call_filter: false 
bootstrap.memory_lock: false 
http.cors.enabled: true 
http.cors.allow‐origin: "*"


查看集群状态:


GET _cat/nodes?v 
GET _cat/health?v 

十一.Elasticsearch-head插件


由于es服务启动之后,访问界面比较丑陋,为了更好的查看索引库当中的信息,

我们可以通过安装elasticsearch-head这个插件来实现,这个插件可以更方便快

捷的看到es的管理界面


elasticsearch-head这个插件是es提供的一个用于图形化界面查看的一个插件工

具,可以安装上这个插件之后,通过这个插件来实现我们通过浏览器查看es当中

的数据


安装elasticsearch-head这个插件这里提供两种方式进行安装,第一种方式就是

自己下载源码包进行编译,耗时比较长,网络较差的情况下,基本上不可能安装

成功。


第二种方式就是直接使用我已经编译好的安装包,进行修改配置即可


要安装elasticsearch-head插件,需要先安装Node.js


1 安装nodejs


Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境。


Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Node.js 不是一个 JavaScript 框架,不同于CakePHP、Django、Rails。Node.js 更不是浏览器端的库,不能与 jQuery、ExtJS 相提并论。Node.js 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与 PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。


1.1 下载安装包


node1.hxl.cn机器执行以下命令下载安装包,然后进行解压


cd /usr/local/es 
wget https://npm.taobao.org/mirrors/node/v8.1.0/node‐v8.1.0‐linux‐ 
x64.tar.gz 
tar ‐zxvf node‐v8.1.0‐linux‐x64.tar.gz ‐C /usr/local/es/ 

1.2 创建软连接


node1.hxl.cn执行以下命令创建软连接


sudo ln ‐s /usr/local/es/node‐v8.1.0‐linux‐x64/lib/node_modules/npm/bin/np 
m‐cli.js /usr/local/bin/npm 
sudo ln ‐s /usr/local/es/node‐v8.1.0‐linux‐x64/bin/node /usr/local/bin/nod 
e 

1.3 修改环境变量


node1.hxl.cn服务器添加环境变量


vi /etc/profile 
export NODE_HOME=/usr/local/es/node‐v8.1.0‐linux‐x64 
export PATH=:$PATH:$NODE_HOME/bin 


修改完环境变量使用source生效


source /etc/profile


1.4 验证安装成功


node1.hxl.cn执行以下命令验证安装生效


node ‐v 
npm ‐v 


2 本地安装

2.1 上传压缩包到/usr/local/es路径下去


将我们的压缩包 elasticsearch-head-compile-after.tar.gz 上传到服务器

的/usr/local/es 路径下面去


2.2 解压安装包


在服务器中执行以下命令解压安装包


cd /usr/local/es/ 
tar ‐zxvf elasticsearch‐head‐compile‐after.tar.gz ‐C /usr/local/es/ 


2.3 node1.hxl.cn机器修改Gruntfile.js


修改Gruntfile.js这个文件


cd /usr/local/es/elasticsearch‐head 
vim Gruntfile.js 


找到代码中的93行:hostname: '192.168.100.100', 修改为:node1.hxl.cn


connect: { 
server: { 
options: { 
hostname: 'node1.hxl.cn', 
port: 9100, 
base: '.', 
keepalive: true 
} 
} 
} 

2.4 node1机器修改app.js


第一台机器修改app.js


cd /usr/local/es/elasticsearch‐head/_site 
vim app.js 
#在Vim中输入「:4354」,定位到第4354行,
#修改 http://localhost:9200为
http://node1.hxl.cn:9200 

2.5 启动head服务


node1.hxl.cn启动elasticsearch-head插件


cd /usr/local/es/elasticsearch‐head/node_modules/grunt/bin/进程前台启动命令 
./grunt server 


进程后台启动命令


nohup ./grunt server >/dev/null 2>&1 & 
Running "connect:server" (connect) taskWaiting forever...Started connect web server on http://192.168.52.100:9100 
# 如何停止:elasticsearch‐head进程 
# 执行以下命令找到elasticsearch‐head的插件进程,然后使用kill ‐9 杀死进程即可 
netstat ‐nltp | grep 9100 
kill ‐9 8328 

2.6 访问elasticsearch-head界面


打开Google Chrome访问

http://ip:9100/


注意:搭建es集群,启动三个es节点,访问elasticsearch-head时只显示一个

master


解决方案:进到节点2、3的/elasticsearch-7.6.1/data/目录下删除nodes文件,

之后重启节点2、3的es进程即可


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
存储 关系型数据库 MySQL
浅谈Elasticsearch的入门与实践
本文主要围绕ES核心特性:分布式存储特性和分析检索能力,介绍了概念、原理与实践案例,希望让读者快速理解ES的核心特性与应用场景。
|
30天前
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
48 4
|
3月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
19124 21
|
1月前
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
47 0
|
1月前
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
32 0
|
1月前
|
消息中间件 监控 关系型数据库
MySQL数据实时同步到Elasticsearch:技术深度解析与实践分享
在当今的数据驱动时代,实时数据同步成为许多应用系统的核心需求之一。MySQL作为关系型数据库的代表,以其强大的事务处理能力和数据完整性保障,广泛应用于各种业务场景中。然而,随着数据量的增长和查询复杂度的提升,单一依赖MySQL进行高效的数据检索和分析变得日益困难。这时,Elasticsearch(简称ES)以其卓越的搜索性能、灵活的数据模式以及强大的可扩展性,成为处理复杂查询需求的理想选择。本文将深入探讨MySQL数据实时同步到Elasticsearch的技术实现与最佳实践。
70 0
|
2月前
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
|
3月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
97 1
|
3月前
|
存储 自然语言处理 Java
ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询
ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询
25 0
|
3月前
|
自然语言处理 Java
ElasticSearch 实现分词全文检索 - 高亮查询
ElasticSearch 实现分词全文检索 - 高亮查询
61 0