Elasticsearch
一、Kibana常用命令
1.使⽤Kibana创建索引库
{
"settings": {
"属性名": "属性值"
}
}
settings:就是索引库设置,其中可以定义索引库的各种属性,⽬前我们可以不设置,都⾛默认。
2.查看索引库
GET /索引库名
3.删除索引库
DELETE /索引库名
4.创建字段映射
PUT /索引库名/_mapping/typeName
{
"properties": {
"字段名": {
"type": "类型",
"index": true,
"store": false,
"analyzer": "分词器"
}
}
}
属性描述
属性 | 描述 |
---|---|
type | 类型,可以是text、keyword、long、short、date、integer、object等 |
index | 是否索引,默认为true |
store | 是否存储,默认为false |
analyzer | 分词器,例如设置为ik_max_word值,即使⽤IK分词器 |
注意:在进⾏创建索引库中的字段映射时,需要先确保索引库被创建,否则会抛index_not_found_exception异常。
5.查看映射关系
GET /索引库名/_mapping (查看某个索引库中所有类型的映射)
GET /索引库名/_mapping/类型名 (要查看某个类型映射,可以在路径后⾯跟上类型名称)
6.创建索引库
PUT /名称
7.使用kibana对文档操作
7.1 新增文档随机生成id
POST /索引库名/类型名
{
"key":"value"
}
7.2 新增⽂档并⾃定义id
POST /索引库名/类型/id值
{
...
}
8.修改数据
PUT表示修改⽂档。不过修改必须指定id。分为以下两种情况:
- 如果id对应的⽂档存在,则修改。
- 如果id对应的⽂档不存在,则新增。
PUT /yx/goods/id值
9.删除数据
DELETE /索引库名/类型名/id值
二、查询(重点掌握内容)
- 基本查询
- 结果过滤
- 排序
- 高级查询
1.基本查询
基本语法:
GET /索引库名/_search
{
"query": {
"查询类型": {
"查询条件": "查询条件值"
}
}
}
解释:这⾥的query代表⼀个查询对象,⾥⾯可以有不同的查询属性。
-
查询类型:例如match_all、match、term、range等
-
查询条件:查询条件会根据类型的不同,写法也有差异,后⾯详细讲解
1.1 查询所有
演示示例:
GET /yx/_search
{
"query": {
"match_all": {}
}
}
语法说明:
属性 | 描述 |
---|---|
query | 代表查询对象 |
match_all | 代表上查询所有 |
1.2 匹配查询
OR关系
match类型查询,会把查询条件进⾏分词,然后进⾏查询,多个词条之间是OR的关系。
GET /yx/_search
{
"query": {
"match": {
"title": "⼩⽶电视"
}
}
}
解释:此命令不仅会查询到“电视”,⽽且与“⼩⽶”相关的都会查询到,多个词之间是OR的关系
AND关系
GET /yx/_search
{
"query": {
"match": {
"title": {
"query": "⼩⽶电视",
"operator": "and"
}
}
}
}
解释:本例中包含“小米”和“电视”的词条才会被搜索到
1.3 词条匹配
term查询被⽤于精确值匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串,keyword类型的字符串。
效果类似于: SELECT * FROM tableName WHERE colName='value';
的SQL语句。
GET /yx/_search
{
"query": {
"term": {
"price": 2699.00
}
}
}
1.4 布尔组合
bool把各种其它查询通过must(与)、must_not(⾮)、should(或)的⽅式进⾏组合。
GET /yx/_search
{
"query": {
"bool": {
"must": {
"match": {
"title": "⼤⽶"
}
},
"must_not": {
"match": {
"title": "电视"
}
},
"should": {
"match": {
"title": "⼿机"
}
}
}
}
}
1.5 范围查询(range)
range查询找出那些落在指定区间内的数字或者时间。
GET /yx/_search
{
"query": {
"range": {
"price": {
"gte": 3000,
"lte": 4000
}
}
}
}
range查询允许一下字符:
操作符 | 说明 |
---|---|
gt | 大于 |
gte | 大于等于 |
lt | 小于 |
lte | 小于等于 |
1.6 模糊查询(fuzzy)
fuzzy查询是term查询的模糊等价,很少直接使⽤它。
GET /yx/_search
{
"query": {
"fuzzy": {
"title": "Appla"
}
}
}
2.结果过滤
默认情况下,Elasticsearch在搜索的结果中,会把⽂档中保存在 _source 的所有字段都返回。
如果我们只想获取其中的部分字段,我们可以添加 _source 的过滤。
2.1 直接指定字段
GET /yx/_search
{
"_source": ["title", "price"],
"query": {
"term": {
"price": 2699
}
}
}
2.2 指定includes和excludes
属性 | 描述 |
---|---|
includes | 来制定想要显示的字段 |
excludes | 来制定不想要显示的字段 |
二者可选
示例:
GET /yx/_search
{
"_source": {
"includes": ["title", "images"]
},
"query": {
"term": {
"price": 2699
}
}
}
GET /yx/_search
{
"_source": {
"excludes": ["price"]
},
"query": {
"term": {
"price": 2699
}
}
}
2.3 过滤(filter)
Elasticsearch使⽤的查询语⾔(DSL)拥有⼀套查询组件,这些组件可以以⽆限组合的⽅式进⾏搭配。
这套组件可以在以下两种情况下使⽤:
过滤情况(fifiltering context)和查询情况(query context)。
那么如何选择查询与过滤?
通常的规则是,使⽤查询(query)语句来进⾏全⽂搜索或者其它任何需要影响相关性得分的搜索。 除此以外的情况都使⽤过滤(fifilters)。
2.3.1 条件查询中进行过滤
如果我们需要在查询结果中进行过滤,并且不希望过滤条件影响评分,这个时候就可以使用filter:
GET /yx/_search
{
"query": {
"bool": {
"must": {
"match": {
"title": "⼩⽶⼿机"
}
},
"filter": {
"range": {
"price": {
"gt": 2000.00,
"lt": 3800.00
}
}
}
}
}
}
2.3.2 无查询条件直接过滤
如果一次查询只有过滤,没有查询条件,不希望进行评分,我们可以使用constant_score取代只有filter语句的查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助
GET /yx/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"price": {
"gt": 2000.00,
"lt": 3800.00
}
}
}
}
}
}
3.结果排序
3.1 单字段排序
sort可以让我们按照不同的字段进⾏排序,并且通过order指定排序的⽅式
属性 | 描述 |
---|---|
asc | 升序排序 |
desc | 降序排序 |
示例:
GET /yx/_search
{
"query": {
"match": {
"title": "⼩⽶⼿机"
}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
3.2 多字段排序
4 分页查询
Elasticsearch的分⻚与MySQL数据库⾮常相似,都是指定两个值:
属性 | 描述 |
---|---|
from | 目标数据的偏移值(开始位置),默认from为0 |
size | 每页大小 |
示例:
GET /yx/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "desc"
}
}
],
"from": 1,
"size": 3
}
响应结果:
{
"took": 17,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": null,
"hits": [
{
"_index": "yx",
"_type": "goods",
"_id": "2",
"_score": null,
"_source": {
"title": "IPhone⼿机",
"images": "http://image.yx.com/12479122.jpg",
"price": 6299,
"stock": 200,
"saleable": true,
"subTitle": "IPhone 15 Pro"
},
"sort": [
6299
]
},
{
"_index": "yx",
"_type": "goods",
"_id": "3",
"_score": null,
"_source": {
"title": "⼩⽶电视4A",
"images": "http://image.yx.com/12479122.jpg",
"price": 3899
},
"sort": [
3899
]
}
]
}
}
5.高亮显示
高亮原理:
- 服务端搜索数据,得到搜索结果
- 把搜索结果中,搜索关键字都加上约定好的标签
- 前端页面提前写好标签的css样式,即可高亮显示
GET /yx/_search
{
"query": {
"match": {
"title": "⼿机"
}
},
"highlight": {
"pre_tags": "<span>",
"post_tags": "</span>",
"fields": {
"title": {}
}
}
}
在使⽤match查询的同时,加上⼀个highlight属性。highlight属性提供以下属性:
属性 | 描述 |
---|---|
pre_tags | 前置标签 |
post_tags | 后置标签 |
fields | 需要高亮的字段 |