1、ES中基本概念
1、接近实时(NRT Near Real Time )
Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有 一个轻微的延迟(通常是1秒内)
2、索引(index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产 品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且 当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于 关系型数据库中Database 的概念。在一个集群中,如果你想,可以定义任意多的索引。
3、类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义 完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客 平台并且将你所有的数 据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客 数据定义另一个类型,当然,也可 以为评论数据定义另一个类型。类型类似于关系型数据库中Table的 概念。
4、映射(Mapping)
Mapping是ES中的一个很重要的内容,它类似于传统关系型数据中table的schema,用于定义一个索 引(index)中的类型(type)的数据的结构。 在ES中,我们可以手动创建type(相当于table)和mapping(相 关与schema),也可以采用默认创建方式。在默认配置下,ES可以根据插入的数据自动地创建type及其 mapping。 mapping中主要包括字段名、字段数据类型和字段索引类型
5、文档(document)
一个文档是一个可被索引的基础信息单元,类似于表中的一条记录。比如,你可以拥有某一个员工的文 档,也可以拥有某个商品的一个文档。文档以采用了轻量级的数据交换格式JSON(Javascript Object Notation)来表示。
6、概念关系图
2、Kibana的基本操作
1、索引(Index)的基本操作
PUT /dangdang/ 创建索引
DELETE /dangdang 删除索引
DELETE /* 删除所有索引
GET /_cat/indices?v 查看索引信息
2、 类型(type)的基本操作
创建类型
1.创建/dangdang索引并创建(product)类型
PUT /dangdang
{
"mappings": {
"product": {
"properties": {
"title": {
"type": "text"
},
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"created": {
"type": "date"
}
}
}
}
}
注意: 这种方式创建类型要求索引不能存在
查看类型
GET /dangdang/mapping/product # 语法:GET /索引名/mapping/类型名
3、文档(document)的基本操作
1、添加文档
PUT /ems/emp/1 #/索引/类型/id
{
"name": "赵小六",
"age": 23,
"bir": "2012-12-12",
"content": "这是一个好一点的员工"
}
2、查询文档
GET /ems/emp/1
返回结果:
{
"_index": "ems",
"_type": "emp",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "赵小六",
"age": 23,
"bir": "2012-12-12",
"content": "这是一个好一点的员工"
}
}
3、删除文档
DELETE /ems/emp/1
{
"_index": "ems",
"_type": "emp",
"_id": "1",
"_version": 2,
"result": "deleted", #删除成功
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
4、更新文档
1.第一种方式 更新原有的数据,数据完全改变
POST /dangdang/emp/1/_update
{
"doc": {
"name": "xiaohei"
}
}
2.第二种方式 添加新的数据,这种更新,如果没有这个字段,就会添加上这个字段。
POST /ems/emp/1/_update
{
"doc": {
"name": "xiaohei",
"age": 11,
"dpet": "你好部门"
}
}
3.第三种方式 在原来数据基础上更新
POST /ems/emp/1/_update
{
"script": "ctx._source.age += 5"
}
ES的使用语法风格为: /// REST操作 /索引/类型/文档id
5、批量操作
- 批量索引两个文档
PUT /dangdang/emp/_bulk
{
"index": {
"_id": "1"
}
}
{
"name": "John Doe",
"age": 23,
"bir": "2012-12-12"
}
{
"index": {
"_id": "2"
}
}
{
"name": "Jane Doe",
"age": 23,
"bir": "2012-12-12"
}
2. 更新文档同时删除文档
POST /dangdang/emp/_bulk
{
"update": {
"_id": "1"
}
}
{
"doc": {
"name": "lisi"
}
}
{
"delete": {
"_id": 2
}
}
{
"index": {}
}
{
"name": "xxx",
"age": 23
}
注意:批量时不会因为一个失败而全部失败,而是继续执行后续操作,批量在返回时按照执行的状态开始返回
3、ES中高级检索(Query)
1、检索方式 _search
ES官方提供了两中检索方式:一种是通过 URL 参数进行搜索,另一种是通过 DSL(Domain Specified Language) 进行搜索。官方更推荐使用第二种方式第二种方式是基于传递JSON作为请求体(request body)格式与ES进行交互,这种方式更强大,更简洁。
- 使用语法
URL查询: GET /索引/类型/_search?参数 DSL查询: GET /索引/类型/_search {}
2、测试数据
1.删除索引
DELETE /ems
2.创建索引并指定类型
PUT /ems
{
"mappings": {
"emp": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"bir": {
"type": "date"
},
"content": {
"type": "text"
},
"address": {
"type": "keyword"
}
}
}
}
}
3、插入测试数据
PUT /ems/emp/_bulk
{
"index": {}
}
{
"name": "小黑",
"age": 23,
"bir": "2012-12-12",
"content":"为开发团队选择一款优秀的MVC框
架是件难事儿,在众多可行的方案中决择需要很高的经验和水平","address":"北京"}
{
"index": {}
}
{
"name": "王小黑",
"age": 24,
"bir": "2012-12-12",
"content":"Spring 框架是一个分层架
构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理
bean 的方式","address":"上海"}
{
"index": {}
}
{
"name": "张小五",
"age": 8,
"bir": "2012-12-12",
"content":"Spring Cloud 作为Java 语
言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。Spring Cloud 的组
件非常多,涉及微服务的方方面面,井在开源社区Spring 和Netflix 、Pivotal 两大公司的推动下越来
越完善","address":"无锡"}
{
"index": {}
}
{
"name": "win7",
"age": 9,
"bir": "2012-12-12",
"content":"Spring的目标是致力于全方位的
简化Java开发。 这势必引出更多的解释, Spring是如何简化Java开发的?","address":"南京"}
{
"index": {}
}
{
"name": "梅超风",
"age": 43,
"bir": "2012-12-12",
"content":"Redis是一个开源的使用ANSI
C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的
API","address":"杭州"}
{
"index": {}
}
{
"name": "张无忌",
"age": 59,
"bir": "2012-12-12",
"content":"ElasticSearch是一个基于
Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接
口","address":"北京"}
3、URL 检索
GET /ems/emp/_search?q=*&sort=age:asc
_search 搜索的API
q=* 匹配所有文档
sort 以结果中的指定字段排序
GET /ems/emp/search?q=*&sort=age:desc&size=5&from=0&source=name,age,bir
4、DSL检索
GET /ems/emp/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
4、DSL高级检索(Query)
1、查询所有(match_all)
match_all关键字: 返回索引中的全部文档
GET /ems/emp/_search
{
"query": {
"match_all": {}
}
}
2、查询结果中返回指定条数(size)
size 关键字: 指定查询结果中返回指定条数。 默认返回值10条
GET /ems/emp/_search
{
"query": {
"match_all": {}
},
"size": 1
}
3、分页查询(from)
from 关键字: 用来指定起始返回位置,和size关键字连用可实现分页效果
GET /ems/emp/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"size": 2,
"from": 1
}
4、查询结果中返回指定字段(_source)
_source 关键字: 是一个数组,在数组中用来指定展示那些字段
GET /ems/emp/_search
{
"query": {
"match_all": {}
},
"_source": [
"account_number",
"balance"
]
}
5、关键词查询(term)
term 关键字: 用来使用关键词查询
GET /ems/emp/_search
{
"query": {
"term": {
"address": {
"value": "北京"
}
}
}
}
- NOTE1: 通过使用term查询得知ES中默认使用分词器为标准分词器(StandardAnalyzer),标准分词器 对于英文单词分词,对于中文单字分词。
- NOTE2: 通过使用term查询得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 这些类型不分词,只有text类型分词。
6、范围查询(range)
range 关键字: 用来指定查询指定范围内的文档
GET /ems/emp/_search
{
"query": {
"range": {
"age": {
"gte": 8,
"lte": 30
}
}
}
}
7、前缀查询(prefix)
prefix 关键字: 用来检索含有指定前缀的关键词的相关文档
GET /ems/emp/_search
{
"query": {
"prefix": {
"content": {
"value": "redis"
}
}
}
}
8、通配符查询(wildcard)
wildcard 关键字: 通配符查询 ? 用来匹配一个任意字符 * 用来匹配多个任意字符
GET /ems/emp/_search
{
"query": {
"wildcard": {
"content": {
"value": "re*"
}
}
}
}
9、多id查询(ids)
ids 关键字 : 值为数组类型,用来根据一组id获取多个对应的文档
GET /ems/emp/_search
{
"query": {
"ids": {
"values": [
"lg5HwWkBxH7z6xax7W3_",
"lQ5HwWkBxH7z6xax7W3_"
]
}
}
}
10、模糊查询(fuzzy)
fuzzy 关键字: 用来模糊查询含有指定关键字的文档
GET /ems/emp/_search
{
"query": {
"fuzzy": {
"content": "spring"
}
}
}
fuzzy 模糊查询 最大模糊错误 必须在0-2之间
# 搜索关键词长度为 2 不允许存在模糊 0
# 搜索关键词长度为3-5 允许一次模糊 0 1
# 搜索关键词长度大于5 允许最大2模糊
11、布尔查询(bool)
bool 关键字: 用来组合多个条件实现复杂查询 must: 相当于&& 同时成立 should: 相当于|| 成立一个就行 must_not: 相当于! 不能满足任何一个
GET /ems/emp/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"age": {
"gte": 0,
"lte": 30
}
}
}
],
"must_not": [
{
"wildcard": {
"content": {
"value": "redi?"
}
}
}
]
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
12、高亮查询(highlight)
highlight 关键字: 可以让符合条件的文档中的关键词高亮
GET /ems/emp/_search
{
"query": {
"term": {
"content": {
"value": "redis"
}
}
},
"highlight": {
"fields": {
"*": {}
}
}
}
自定义高亮html标签: 可以在highlight中使用 pre_tags 和 post_tag
GET /ems/emp/_search
{
"query": {
"term": {
"content": "框架"
}
},
"highlight": {
"pre_tags": [
"<span style='color:red'>"
],
"post_tags": [
"</span>"
],
"fields": {
"*": {}
}
}
}
多字段高亮 使用 require_field_match 开启多个字段高亮
GET /ems/emp/_search
{
"query": {
"term": {
"content": "框架"
}
},
"highlight": {
"pre_tags": [
"<span style='color:red'>"
],
"post_tags": [
"</span>"
],
"require_field_match": false,
"fields": {
"*": {}
}
}
}
13、多字段查询(multi_match)
GET /ems/emp/_search
{
"query": {
"multi_match": {
"query": "中国",
"fields": [
"name",
"content"
] #这里写要检索的指定字段
}
}
}
14、多字段分词查询(query_string)
GET /dangdang/book/_search
{
"query": {
"query_string": {
"query": "中国声音",
"analyzer": "ik_max_word",
"fields": [
"name",
"content"
]
}
}
}