1. 版本 信息

{"name" : "74c1872a9b2d","cluster_name" : "docker-cluster","cluster_uuid" : "NtcKAJTdTd6rU-NTzwnrSg","version" : {"number" : "8.1.0","build_flavor" : "default","build_type" : "docker","build_hash" : "3700f7679f7d95e36da0b43762189bab189bc53a","build_date" : "2022-03-03T14:20:00.690422633Z","build_snapshot" : false,"lucene_version" : "9.0.0","minimum_wire_compatibility_version" : "7.17.0","minimum_index_compatibility_version" : "7.0.0"},"tagline" : "You Know, for Search"
}

2. 字段属性

2.1. 常用属性

属性 描述
type 数据类型
index 是否创建索引,默认 true
analyze 分词器,对于中文一般选择 ik 分词器的:ik_smart 或 ik_max_word
format 数据格式化,对于日期类型一般需要配置,可以配置多个,如 yyyy-MM-dd HH:mm:ss || yyyy-MM-dd
search_analyzer 查询时使用的分词器,如果不配置默认使用 analyze 的配置项
properties 嵌套的子字段

2.2. 数据类型

数据类型 说明
字符串 keyword:关键字类型,一般整体作为查询条件
text:文本类型,一般为一段文字,需要分词查询等
数字 long、integer、short、byte、double、float、half_float、scaled_float
日期 date,使用时一般配上 format 属性
日期纳秒 date_nacos
布尔 boolean
二进制 binary
范围 integer_range、float_range、long_range、double_range、date_range
经纬度 geo_point,{lat:维度,lon: 经度} 其中:北纬为正数,南纬为负数,东经为正数,西经为负数
经纬范围 geo_shape,由多个经纬度的点组合成的多边形
网络地址 ip
数组 es 中数组不需要一个特定的数据类型,任何字段都默认可以包含一个或多个值
嵌套对象 object
嵌套数组 nested

3. 分词器

3.1. 分词器组成结构

我们可以通过下面的三个部分组成自己想要的分词器效果

组成部分 说明
Character Filter(字符过滤器) 该部分负责对数据的预处理,比如去除特殊字符,转化图标为文字等
Tokenizer(分词器) 该部分负责对一段文字进行分词,得到若干个词元
Token Filter(词元处理器) 该部分负责对词元进一步加工,比如转化为拼音,首字母大写等等

3.2. 内置的分词器

分词器 说明
standard 去除绝大多数标点符号,英文按单词分割,中文按单个字分割,对中文词汇不是很友好
simple 去除所有非字母字符,英文按标点与单词分割并转为小写,中文按标点分割
whitespace 按空格切分,英文不转换大小写
stop 类似于 simple 分词器,去除停用词(默认英文)
keyword 不分词,原样返回
pattern 正则分割,默认对所有非单词(非英文)字符分割 \w+
language 语言分词器,未实现中文
fingerprint 指纹算法分词器,对内容排序,并去重,最终只生成一个词条

3.3. 需要安装的常用分词器

分词器 说明
ik_smart 支持中文,粗粒度拆分
ik_max_word 支持中文,最细粒度拆分
pinyin 支持中文转拼音

3.4. 测试分词器

-- 非自定义分词器测试
GET /_analyze
{"analyzer": "my_analyzer","text": "一段文本"
}-- 自定义分词器的测试,需要指定索引名称,在哪个索引里配置的自定义分词器就用哪个索引
GET /索引名称/_analyze
{"analyzer": "my_analyzer","text": "一段文本"
}

4. 索引操作

4.1. 创建索引

4.1.1. 分词器要求

  • 按照中文词语或者英文单词拆分文本
  • 中文汉字转化为拼音
  • 中文汉字转化为每个字的拼音首字母连接,如 拼音 -> py
PUT /study
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "ik_max_word","filter": "pinyin"}},"filter": {"pinyin": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"remove_duplicated_term": true,"limit_first_letter_length": 16,"none_chinese_pinyin_tokenize": false}}}},"mappings": {}
}

拼音分词器有很多配置项,大致如下

  • keep_first_letter:启用此选项时,例如:刘德华 > ldh,默认值:true
  • keep_separate_first_letter:启用此选项时,将单独保留首字母,例如:刘德华 > l,默认:false,注意:查询结果可能过于模糊
  • limit_first_letter_length:设置 first_letter 结果的最大长度,默认值:16
  • keep_full_pinyin:启用此选项时,例如:刘德华 > [ liu, de, hua],默认值:true
  • keep_joined_full_pinyin:启用此选项时,例如:刘德华 > [ liudehua],默认值:false
  • keep_none_chinese:结果中保留非中文字母或数字,默认值:true
  • keep_none_chinese_together:将非中文字母保持在一起,默认:true,例如:DJ音乐家 > DJyinyuejia
  • keep_none_chinese_in_first_letter:首字母保留非中文字母,例如:刘德华AT2016 > ldhat2016,默认:true
  • keep_none_chinese_in_joined_full_pinyin:保留非中文字母加入完整拼音,例如:刘德华2016 > liudehua2016,默认:false
  • none_chinese_pinyin_tokenize:如果是拼音,则将非中文字母分成单独的拼音词,默认:true,例如:liudehuaalibaba13zhuanghan > liu, de, hua, a, li, ba, ba, 13, zhuang, han, 注意:需要先启用 keep_none_chinese 和 keep_none_chinese_together
  • keep_original:启用此选项时,也将保留原始汉字,默认值:false
  • lowercase:非中文字母转小写,默认:true
  • trim_whitespace:去空格,默认真
  • remove_duplicated_term:删除重复的术语以保存索引,例如:de的 > de,默认:false,注意:位置相关的查询可能会受到影响
  • ignore_pinyin_offset:6.0以后,offset 被严格限制,tokens 重叠是不允许的,有了这个参数,tokens重叠会被忽略 offset,请注意,所有位置相关的查询或高亮都会变得不正确,你应该使用多个字段并为不同的设置指定不同的设置查询目的。如果需要偏移,请将其设置为 false。默认值:true。

4.1.2. 建一个索引

下方所有案例全部采用这个索引库:study

PUT /study
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "ik_max_word","filter": ["length", "pinyin"]}},"filter": {"pinyin": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"remove_duplicated_term": true,"limit_first_letter_length": 16,"none_chinese_pinyin_tokenize": false},"length":{"type":"length","min":2}}}},"mappings": {"properties": {"id": {"type": "integer"},"name": {"type": "text", "analyzer": "my_analyzer", "search_analyzer": "ik_max_word"},"birthday": {"type": "date", "format": "yyyy-MM-dd HH:mm:ss"},"weight": {"type": "double"},"describe": {"type": "text", "analyzer": "my_analyzer", "search_analyzer": "ik_max_word"}}}
}

4.2. 删除索引

DELETE /study

4.3. 修改索引

  • ES 不允许修改或者删除已经存在的字段
  • 修改索引准确的来讲相当于新增字段
PUT /study/_mapping
{"properties": {"geo" : {"type": "geo_point"}}
}

4.4. 查询索引

4.4.1. 查看全部索引

GET /_cat/indices-- 返回值
yellow open study aK2MakZXTp-y0ezGOadPiw 1 1 0 0 225b 225b-- 返回值每一列的意思:
yellow:健康状态,yellow 警告,green 健康,单节点部署的话都为 yellow
open:  当前索引是 打开或关闭 状态
study: 索引名称
aK2MakZXTp-y0ezGOadPiw:索引的唯一标识
1:主分片数
1:副本分片数
0:可用文档
0:已删除文档
225b:主分片、副本分片总存储大小
225b:主分片存储大小

4.4.2. 查询具体索引

GET /study

5. 文档操作

5.1. 新增/覆盖 文档

  • 下方命令中结尾的 2 为文档唯一 ID,字符串类型,如果不设置在会自动生成
  • 如果在执行下方的命令时,发现 ID 已经存在,则会覆盖原来的数据,起到全量修改的作用
POST /study/_doc/2
{"id": 2,"name": "李四","birthday": "1992-07-16 00:00:00","weight": 90.20,"describe": "这是一个品学兼优的学生","sex": "男","geo": "30,60"
}

5.2. 删除文档

  • 下方命令中结尾的 1 为文档新增时设置的唯一 ID
DELETE /study/_doc/1

5.3. 修改文档

  • 如果需要修改大量字段,推荐采用 新增,覆盖的方式
  • 如果只是局部修改一两个字段,可以采用下方的命令
  • 下方命令中结尾的 2 为文档新增时设置的唯一 ID
POST /study/_update/2
{"doc": {"sex": "女"}
}

5.4. 查询文档

  • 下方命令中结尾的 2 为文档新增时设置的唯一 ID
GET /study/_doc/2

6. 条件查询

  • 上方已经实现了根据唯一 ID 的简单查询,但是数据的查询往往不可能这么简单,下方介绍一些常用的查询方式

6.1. 一些关键参数

{"query": { 具体的 DSL 查询条件 },"from": "数字:分页的起始位置,默认 0","size": "数字:每页的最大显示条数,默认 10","sort": [{"字段": "升序 asc、降序 desc"}]
}
  • from 和 size 类似于 mysql 中 limit 查询的两个参数
  • size 最大值不能超过 10000
  • es 的查询不存在全量,都存在分页约束

6.2. 查询全部

  • 查询方式:match_all

  • 由于 ES 的查询都被分页约束,所以该查询相当于没有任何条件的分页查询

  • 想要多看见几条数据,可以加 from:0,size:10000 查看最多一万条数据(不推荐)

GET /study/_search
{"query": {"match_all": {}}
}

6.3. 模糊查询

  • 查询方式:match 和 multi_match
  • 该种方式的查询字段仅适用于:text 类型的数据
-- 单字段
GET /study/_search
{"query": {"match": {"name": "ZS"}}
}-- 多字段
GET /study/_search
{"query": {"multi_match": {"query": "调皮捣蛋","fields": ["describe", "name"]}}
}

6.4. 精确查询

精确查询不支持 text 类型的字段

6.4.1. 相等查询

  • 查询方式:term
  • 类似于传统数据库的 (where field = value)
GET /study/_search
{"query": {"term": {"sex": "男"}}
}

6.4.2. 范围查询

6.4.2.1. 常规范围查询

  • 查询方式:range
  • 适用数据类型:数字,keyword,date 等
  • 类似于传统数据库的 (where field > value1 and field < field2 或者 between … and)
  • gt、gte:大于 大于等于
  • le、lte: 小于 大于等于
GET /study/_search
{"query": {"range": {"weight": {"gte": 10, "lte": 200}}}
}

6.4.2.2. 经纬度范围查询

  • 查询方式:geo_bounding_box
  • 适用数据类型:geo_point
  • top_left:左上角的点坐标
  • bottom_right:右下角的点坐标
  • 查询逻辑:两个点拉成一个矩形,在矩形范围内的点都会被查询出来
  • 以下为 西经50度到东京100度,北纬10度到北纬30度 范围内的数据
GET /study/_search
{"query": {"geo_bounding_box": {"location": {"top_left": { "lat": 30, "lon": -50 },"bottom_right": { "lat": 10, "lon": 100 }}}}
}

6.4.2.3. 经纬度距离查询

  • 查询方式:geo_distance
  • 适用数据类型:geo_point
  • distance:距离
  • location:一个坐标,维度,经度
  • 查询逻辑:计算两个坐标之间的距离,获取 distance 指定范围内的数据
  • 以下为 查询距离 东经59度北纬30度150公里 范围内的数据
GET /study/_search
{"query": {"geo_distance": {"distance": "150km","location": "30,59"}}
}

6.5. 算分排序

6.5.1. 算分规则

ES 在未指定排序字段时,默认会给每一条文档进行打分(_score),分数越高的文档,在查询结果中的排序越靠前。再次基础上,我们可以通过算分函数(function_score)人为干预算分结果,从而实现我们想要的排序结果。如:通过 钞能力 让自己的搜索结果比较靠前

干预算分的三个条件

  • filter:过滤条件,只对满足条件的文档做算分干预,比如充过钱的

  • 算分函数包括:

    • weight:一个常量
    • field_value_factor:用某个字段代替算分,必须是数字类型的字段
    • random_score:随机数
    • script_score:自定义计算公式
  • boost_mode:两种算分模式计算后的 运算模式

    • multiply:query_score + function_score
    • replace: function_score 替换 query_score
    • sum(相加),avg(取平均),max(取最大),min(取最小) 等

6.5.2. 一个例子

  • 查询方式:function_score
  • 以下为查询时,给 王五 的算分在默认的基础上加上 20 分,让他排在第一
GET /study/_search
{"query": {"function_score": {"query": {"match_all": {}},"functions": [{"filter": {"match" : { "name": "王五"} },"weight": 20}],"boost_mode": "sum"}}
}

6.6. 组合查询

6.6.1. 四个组成部分

  • must:必须匹配,其中的内容必须全部符合,相当于 与
  • should:选择性匹配,其中的内容只需要匹配一个,相当于 或
  • must_not:必须不匹配,不参与算分,其中内容必须完全不匹配,相当于 非
  • filter:必须匹配,不参与算分,其中的内容必须全部符合,相当于 与
  • PS:当 must 和 should 同时存在是,should 不起作用,只会增加算分

正常情况下,不参与算分的字段尽量放到 must_not 和 filter 从而提高性能

6.6.2. 一个例子

  • 查询方式:bool

  • 以下为查询:描述中包含学生,且 id 等于2 的数据

GET /study/_search
{"query": {"bool": {"must": [{"match": { "describe": "学生" }}, {"term": { "id": 2 }}]}}
}

6.7. 排序

6.7.1. 常规排序

  • 排序方式: sort
  • 以下为根据 id 倒序
GET /study/_search
{"query": {"match_all": {}},"sort": [{"id": "desc"}]
}

6.7.2. 坐标距离排序

  • 排序方式:_geo_distance
  • 一下为距离当前位置由近到远,并计算出距离
GET /study/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance": {"location": {"lat": 40,"lon": -70},"order": "asc","unit": "km"}}]
}

6.8. 关键字高亮

  • 高亮方法:highlight
  • pre_tags:前缀,默认
  • post_tags:后缀,默认
  • require_field_match:高亮字段是否和原字段要一致,默认 true
GET /study/_search
{"query": {"match": {"describe": "一个学生"}},"highlight": {"fields": {"describe": {"pre_tags": "<em>","post_tags": "</em>","require_field_match": "false"}}}
}

7. 初始化脚本

POST /study/_doc/1
{"id": 1,"name": "张三","birthday": "1991-07-16 00:00:00","weight": 45.32,"describe": "这是一个调皮捣蛋的学生","sex": "女","location": "30,-45"
}POST /study/_doc/2
{"id": 2,"name": "李四","birthday": "1992-07-16 00:00:00","weight": 90.20,"describe": "这是一个品学兼优的学生","sex": "男","location": "30,60"
}POST /study/_doc/3
{"id": 3,"name": "王五","birthday": "2020-07-16 00:00:00","weight": 120.32,"describe": "这是一个中规中矩的学生","sex": "男","location": "30,-45"
}

elasticsearch 简单使用相关推荐

  1. 2021年大数据ELK(二):Elasticsearch简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...

  2. elasticsearch简单操作(二)

    让我们建立一个员工目录,假设我们刚好在Megacorp工作,这时人力资源部门出于某种目的需要让我们创建一个员工目录,这个目录用于促进人文关怀和用于实时协同工作,所以它有以下不同的需求: 1.数据能够包 ...

  3. ElasticSearch简单使用

    文章目录 一.启动ElasticSearch 二.使用ik分词器 1.安装ik 2.重启es,查看加载插件 3.两种分词算法 4.自定义ik关键词 二.ES常用操作 1.创建带有结构的索引 2.增加数 ...

  4. elasticsearch简单使用和ELK的集成

    准备 elasticsearch 介绍: 基于Lucene开发的搜索服务器,它提供了一个多用户的分布式搜索引擎,基于restful web 接口调用,并且是我们Java语言开发,安装简单,使用稳定,高 ...

  5. 全文搜索引擎 ES(Elasticsearch) 简单使用说明

    官网:https://www.elastic.co/cn/elasticsearch/ 官方文档:https://www.elastic.co/guide/en/elasticsearch/refer ...

  6. Elasticsearch 简单使用总结

    目录: 概念 创建索引 定义映射 核心数据类型 映射模板 分词器 倒排索引 简单查询 相关度分数计算 布尔查询 聚合 Metric Bucket Bucket + Metric 聚合分析 Pipeli ...

  7. springboot ElasticSearch 简单的全文检索高亮

    前阵子和张三丰聊天提到了es.这次正好有机会学习并使用 首先引入依赖 <dependency><groupId>org.springframework.boot</gro ...

  8. ElasticSearch简单搭建

    1. ElasticSearch 下载 Get Started with Elasticsearch, Kibana, and the Elastic Stack | Elastic 当然你也可以下载 ...

  9. Bboss Elasticsearch 简单用法(ES 7.*)

    一.官方文档 https://esdoc.bbossgroups.com/#/README 二.官方demo https://github.com/bbossgroups/elasticsearch- ...

  10. Elasticsearch简单搜索以及聚合分析

    1.批量索引文档 如果你有大量文档要索引,你能通过批量 API(bulk API) 来批量提交它们.批量文档操作比单独提交请求显著更快,因为它极简了网络往返. 最佳的批量数量取决于许多因素:文档的大小 ...

最新文章

  1. 测试mktime和localtime_r性能及优化方法
  2. Beaglebone Black教程Beaglebone Black中的Cloud9 IDE基本使用
  3. 设计模式-----单例模式优缺点及使用场景
  4. java+synchro_synchrozied,wait()与notify()的理解
  5. 记录第一次部署servlet实例
  6. 文件md5码怎么生成_Linux 系统文件校验方法--MD5,SHA1,PGP,SHA256,SHA512
  7. 高性价比手持机有哪些
  8. AndroidStudio安卓原生开发_UI高级_StateListDrawable状态选择器_按钮按下和抬起显示不同颜色---Android原生开发工作笔记124
  9. 历经外企、创业公司、大厂的程序员告诉你:第一份工作有多重要!
  10. 芝诺数解|「七」月是故乡明,月饼表浓情
  11. little endian c语言,c语言那些细节之little-endian和big-endian
  12. n个单词输入次数 c语言,C语言问题,从键盘输入n个英语单词.输入格式为n,w1,w2,w3…wn,其中n表示随后输入的英语...
  13. 地图作业平台低代码实战(搭建能力提升)
  14. 计算机房设备包含什么,机房设计常用计算公式有哪些
  15. SDRAM芯片中的DQM信号的理解
  16. 超人气网站集合,快来pick你中意的吧!
  17. 英语发音规则---s发/s/的读音规则
  18. python写的2048游戏,源代码,pygame
  19. CQRS\ES架构介绍
  20. 计算机专业英语博士就业情况,北京外国语大学博士就业前景怎么样

热门文章

  1. phpstorm 竖线 打印分割线设置
  2. [CVPR2019]Cascaded Partial Decoder for Fast and Accurate Salient Object Detection
  3. GitHub神隐藏功能 强推推推推!!
  4. 47..贪心  失恋28天-追女孩篇
  5. 新浪微博新版公测 私信支持文件图片发送(图)
  6. 《封神榜》童年的回忆
  7. 京东金融网银钱包移动版上线 将接入外部商户
  8. 整人脚本-会说话的windows脚本
  9. [远程授权] AMO-K202 或 K216脱机烧录器升级授权方法 (用于开通未授权的通道)
  10. 托众导购网 淘宝客订单API获取订单代码