当前位置:   article > 正文

elasticsearch入门操作+高级操作(超详细)_elastic search操作指南

elastic search操作指南

1.ElasticSearch相关概念

Elasticsearch是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。
对比关系:

索引库(indexes)---------------------------------Databases 数据库
​
    类型(type)----------------------------------Table 数据表
​
        文档(Document)--------------------------Row 行
​
             字段(Field)---------------------Columns 列 
                
                映射配置(mappings)--------- 表结构
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

详细说明:
在这里插入图片描述

2.索引库操作

2.1.创建索引库

Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求
文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
语法:

PUT /blog1
{
  "settings": {
    "属性名": "属性值"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

settings:就是索引库设置,其中可以定义索引库的各种属性,目前我们可以不设置,都走默认

2.2.查看索引库

Get请求可以帮我们查看索引信息,格式:

GET /blog1
  • 1
2.3.删除索引库

删除索引使用DELETE请求

DELETE /blog1
  • 1

3.类型及映射操作

有了索引库,等于有了数据库中的database。接下来就需要索引库中的类型了,也就是数据库中的表。创建数据库表需要设置字段约束,索引库也一样,在创建索引库的类型时,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做字段映射(mapping)
字段的约束包括但不限于:

字段的数据类型
是否要存储
是否要索引
是否分词
分词器是什么
  • 1
  • 2
  • 3
  • 4
  • 5
3.1.创建映射字段(需先创建索引库)
PUT /索引库名/_mapping/类型名称 或 索引库名/类型名称/_mapping
{
  "properties": {
    "字段名": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

类型名称:就是前面将的type的概念,类似于数据库中的表字段名:任意填写,下面指定许多属性,例如:

type:类型,可以是text、long、short、date、integer、object等
index:是否索引,默认为true  
store:是否存储,默认为false
analyzer:分词器,这里的ik_max_word即使用ik分词器
  • 1
  • 2
  • 3
  • 4

示例

PUT /knight/_mapping/goods?include_type_name=true
{
  "properties": {
    "title": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "subtitle": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "images": {
      "type": "keyword",
      "index": "false"
    },
    "price": {
      "type": "float"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

响应结果
在这里插入图片描述
上述案例中,就给knight这个索引库添加了一个名为goods的类型,并且在类型中设置了4个字段:
title:商品标题
subtitle: 商品子标题
images:商品图片
price:商品价格

3.2.映射属性详解

(1)type
Elasticsearch中支持的数据类型非常丰富:
我们说几个关键的:

String类型,又分两种:
text:可分词,不可参与聚合
keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
Numerical:数值类型,分两类
基本数据类型:long、interger、short、byte、doublefloat、half_float浮点数的高精度类型:scaled_float
需要指定一个精度因子,比如10100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
Date:日期类型
elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
Array:数组类型
进行匹配时,任意一个元素满足,都认为满足
排序时,如果升序则用数组中的最小值来排序,如果降序则用数组中的最大值来排序
Object:对象
{
    name:"Jack",
    age:21,
    girl:{
        name: "Rose", age:21
   }
}
如果存储到索引库的是对象类型,例如上面的girl,会把girl编程两个字段:girl.name和girl.age
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

(2)index
index影响字段的索引情况。

true:字段会被索引,则可以用来进行搜索。默认值就是true
false:字段不会被索引,不能用来搜索
  • 1
  • 2

index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false
(3)store
是否将数据进行独立存储。
原始的文本会存储在_source里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置,默认为false。

3.3.查看映射关系

语法:

GET /索引库名/_mapping/类型名
  • 1

示例:

GET /knight/_mapping/goods?include_type_name=true
  • 1

响应
在这里插入图片描述

3.4.一次创建索引库和类型(常用)

刚才 的案例中我们是把创建索引库和类型分开来做,其实也可以在创建索引库的同时,直接制定索引库中的类型,基本语法:

put /索引库名
{
    "settings":{
        "索引库属性名":"索引库属性值"
    },
    "mappings":{
        "类型名":{
            "properties":{
                "字段名":{
                    "映射属性名":"映射属性值"
                }
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

实例

PUT /knight2?include_type_name=true
{
  "settings": {},
  "mappings": {
    "goods": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

结果
在这里插入图片描述

4.文档操作

文档,即索引库中某个类型下的数据,会根据规则创建索引,将来用来搜索。可以类比做数据库中的每一行数据。

4.1.新增并随机生成id

通过POST请求,可以向一个已经存在的索引库中添加文档数据。
语法:

POST /索引库名/类型名
{
    "key":"value"
}
  • 1
  • 2
  • 3
  • 4

示例

POST /knight2/goods/
{
    "title":"小米手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":2699.00
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

可以看到结果显示为:created,应该是创建成功了。
另外,需要注意的是,在响应结果中有个_id字段,这个就是这条文档数据的唯一标示,以后的增删改查都依赖这个id作为唯一标示。
可以看到id的值为:pV75VnMBsO9qhXdwWe2q,这里我们新增时没有指定id,所以是ES帮我们随机生成的id

4.2.查看文档

根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里我们把刚刚生成数据的id带上。

GET /knight/goods/pV75VnMBsO9qhXdwWe2q
  • 1

在这里插入图片描述

_source:源文档信息,所有的数据都在里面。
_id:这条文档的唯一标示
  • 1
  • 2
4.3.新增文档并自定义id

如果我们想要自己新增的时候指定id,可以这么做:

POST /索引库名/类型/id值
{
    ...
}
  • 1
  • 2
  • 3
  • 4

示例:

POST /knight2/goods/1
{
    "title":"小米手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":2699.00
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

得到的数据
在这里插入图片描述

4.4.修改数据

把刚才新增的请求方式改为PUT,就是修改了。不过修改必须指定id,

id对应文档存在,则修改
id对应文档不存在,则新增
  • 1
  • 2

比如,我们把使用id为3,不存在,则应该是新增:

POST /knight2/goods/3
{
    "title":"小米手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":2699.00
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
可以看到是created,是新增。
我们再次执行刚才的请求,不过把数据改一下:

POST /knight2/goods/3
{
    "title":"小米手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":3299.00
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
可以看到结果是:updated,显然是更新数据

4.5.删除数据

(1)根据id进行删除:
语法

DELETE /索引库名/类型名/id值
  • 1

实例


DELETE knight/goods/3
  • 1
  • 2

结果
在这里插入图片描述
可以看到结果是:deleted,显然是删除数据
(2)根据查询条件进行删除
语法

POST  /索引库名/_delete_by_query
{
  "query": { 
    "match": {
      "字段名": "搜索关键字"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

示例:

POST knight/_delete_by_query
{
  "query":{
    "match":{
      "title":"小米"
    }
  }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结果:
在这里插入图片描述

4.6.删除所有数据
POST  索引库名/_delete_by_query
{
  "query": { 
    "match_all": {}
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

示例:

POST /knight/_search
{
  "query": {
    "match_all": {
      
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5.查询

7种查询

基本查询
_source过滤
结果过滤
高级查询
排序
高亮
分页
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

导入数据,这里是采用批处理的API,大家直接复制到kibana运行即可,注意千万别使用kibana的格式化

POST /knight/goods/_bulk
{"index":{}}
{"title":"大米手机","images":"http://image.leyou.com/12479122.jpg","price":3288}
{"index":{}}
{"title":"小米手机","images":"http://image.leyou.com/12479122.jpg","price":2699}
{"index":{}}
{"title":"小米电视4A","images":"http://image.leyou.com/12479122.jpg","price":4288}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5.1.基本查询

基本语法

POST /索引库名/_search
{
    "query":{
        "查询类型":{
            "查询条件":"查询条件值"
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这里的query代表一个查询对象,里面可以有不同的查询属性

查询类型:
例如:match_all, match,term , range 等等
查询条件:查询条件会根据类型的不同,写法也有差异,在后面
  • 1
  • 2
  • 3
5.1.1 查询所有(match_all)

示例:

POST /knight/_search
{
    "query":{
        "match_all": {}
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
query:代表查询对象
match_all:代表查询所有
  • 1
  • 2

结果中的数据解释

took:查询花费时间,单位是毫秒
time_out:是否超时
_shards:分片信息
hits:搜索结果总览对象
total:搜索到的总条数
max_score:所有结果中文档得分的最高分
hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
    _index:索引库
    _type:文档类型
    _id:文档id
    _score:文档得分
    _source:文档的源数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
5.1.2 匹配查询(match)

现在,索引库中有2部手机,1台电视;
or关系
match类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系

POST /knight/_search
{
  "query": {
    "match": {
      "title": "小米电视4A"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在上面的案例中,不仅会查询到电视,而且与小米相关的都会查询到,多个词之间是or的关系
and关系
某些情况下,我们需要更精确查找,我们希望这个关系变成and,可以这样做

POST /knight/_search
{
  "query": {
    "match": {
      "title": {
        "query": "小米电视4A","operator": "and"
        }
      }
    }
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果只有小米电视4A
本例中,只有同时包含小米和电视的词条才会被搜索到。

5.1.3 多字段查询(multi_match)

multi_match与match类似,不同的是它可以在多个字段中查询
为了测试效果我们在这里新增一条数据:

POST /knight/goods
{
    "title": "华为手机",
    "images": "http://image.leyou.com/12479122.jpg",
    "price": 5288,
    "subtitle": "小米"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

示例:

POST /knight/_search
{
  "query": {
    "multi_match": {
      "query": "小米",
      "fields": ["title","subtitle"]
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

本例中,我们会假设在title字段和subtitle字段中查询小米这个词

5.1.4 词条匹配(term)

term 查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串

POST /knight/_search
{
    "query":{
        "term":{
            "price":2699
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

结果:小米手机

5.1.5 多词条精确匹配(terms)

terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于mysql的in:

POST /knight/_search
{
    "query":{
        "terms":{
            "price":[2699,5288]
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5.2.结果过滤

默认情况下,elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。
如果我们只想获取其中的部分字段,我们可以添加_source的过滤

5.2.1.直接指定字段

示例:

POST /knight/_search
{
  "_source": ["title", "price"],
  "query": {
    "term": {
      "price": 2699
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

返回的结果:
只有价格和标题了
在这里插入图片描述

5.2.2.指定includes和excludes

我们也可以通过:

includes:来指定想要显示的字段
excludes:来指定不想要显示的字段
  • 1
  • 2

示例:exclude

POST /knight/_search
{
  "_source": {
     "excludes": ["images"]
  },
  "query": {
    "term": {
      "price": 2699
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果
不显示图片了,只有价格和标题了
在这里插入图片描述

5.3 高级查询(了解)

bool把各种其它查询通过must(与)、must_not(非)、should(或)的方式进行组合

5.3.1 布尔组合(bool)
GET /knight/_search
{
    "query":{
        "bool":{
            "must":     { "match": { "title": "小米" }},
            "must_not": { "match": { "title":  "电视" }},
            "should":   { "match": { "title": "手机" }}
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
5.3.2 范围查询(range)

range 查询找出那些落在指定区间内的数字或者时间
range查询允许以下字符:
在这里插入图片描述
示例:

POST /knight/_search
{
    "query":{
        "range": {
            "price": {
                "gte":  3000,
                "lt":   5000
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
5.3.3 模糊查询(fuzzy)

我们新增一个商品:

POST /knight/goods/4
{
    "title":"apple手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":5899.00
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

fuzzy自动将拼写错误的搜索文本,进行纠正,纠正以后去尝试匹配索引中的数据
它允许用户搜索词条与实际词条出现偏差,但是偏差的编辑距离不得超过2:

POST /knight/_search
{
  "query": {
    "fuzzy": {
      "title": "appla"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

上面的查询,也能查询到apple手机
fuzziness,你的搜索文本最多可以纠正几个字母去跟你的数据进行匹配,默认如果不设置,就是2我们可以通过

POST /knight/_search
{
  "query": {
    "fuzzy": {
      "title": {
        "value": "applaa",
        "fuzziness": 2
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5.4 排序

5.4.1 单字段排序

sort 可以让我们按照不同的字段进行排序,并且通过order指定排序的方式

POST /knight/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {"price": {"order": "desc"}}
  ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
5.4.2 多字段排序

假定我们想要结合使用 price和 _score(得分) 进行查询,并且匹配的结果首先按照价格排序,然后按照相关性得分排序:

POST /knight/_search
{
    "query":{
        "match_all":{}
    },
    "sort": [
      { "price": { "order": "desc" }},
      { "_score": { "order": "desc" }}
    ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5.5.高亮

elasticsearch中实现高亮的语法比较简单:

POST /knight/_search
{
  "query": {
    "match": {
      "title": "手机"
    }
  },
  "highlight": {
    "pre_tags": "<font color='pink'>",
    "post_tags": "</font>",
    "fields": {
      "title": {}
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在使用match查询的同时,加上一个highlight属性:

pre_tags:前置标签
post_tags:后置标签
fields:需要高亮的字段
title:这里声明title字段需要高亮,后面可以为这个字段设置特有配置,也可以空
  • 1
  • 2
  • 3
  • 4

结果:
在这里插入图片描述

5.6 分页

elasticsearch中实现分页的语法非常简单:

POST /knight/_search
{
  "query": {
    "match_all": {}
  },
  "size": 2,
  "from": 0
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

size:每页显示多少条
from:当前页起始索引, int start = (pageNum - 1) * size;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/1005831
推荐阅读
相关标签
  

闽ICP备14008679号