ElasticSearch(2)------ES的基本操作

ElasticSearch(2)------ES的基本操作

前言

在上篇博文中,我们安装好了ElasticSearch和Kibana管理插件,万事俱备,在这篇文章中,我们将一起来了解一下ES的基本操作.

正文

1. 倒排索引

ES使用一种叫倒排索引的结构,它适用于快速的全文搜索.一个倒排索引由文档中所有不重复词的列表构成,对于其中每一个词,有一个包含它的文档列表.

比如我们有以下的文档数据,在图中左侧是每一个文档对应的文档编号,右侧是文档的内容,我对这些文档来建立倒排索引:

在这里插入图片描述

  1. 首先利用分词技术将文档自动切分成不重复的单词,切分的粒度根绝不同的分词技术有所不同,这样每个文档就转换成由多个单词构成的数据流,为了操作的方便,对每个不同的单词赋予唯一的单词编号,同时记录哪些文档中包含这个单词,结果如下:

    在这里插入图片描述

    表中第一列是单词的ID,第二列是每一个单词,第三列是包含该单词的文档ID.

  2. 除了记录包含的文档ID之外,索引系统还可以记录更多的信息,如下图还记录了单词在每个文档中出现的频率(TF):

    在这里插入图片描述

    初此之外还可以记录单词在某个文档中出现的位置信息.

  3. 有了这个索引系统,搜索引擎可以很方便的响应用户的查询.比如搜索Facebook,搜索系统查询倒排索引,就很容易的找到对应的文档.

2. 分词器和内置分词器

分词器: 从一串文本中切分出一个一个的词条,并对每个词条进行标准化.

分词器包含三个部分:

  • character filter

    分词之前的预处理,过滤掉HTML标签,特殊符号转换等.

  • tokenizer: 分词

  • token filter: 标准化(大小写转换,同义词转换,单复数转换等)

ElasticSearch内置分词器有以下几种:

  • standard分词器

    这是ES默认的分词器,它会将词汇单元转换成小写形式,并去除停用词和标点符号,支持中文的单字切分.

  • simple分词器

    首先会通过非字母字符来分割文本信息,然后将词汇单元统一为小写形式.它会去掉数字类型的字符.

  • Whitespace分词器

    仅仅是去掉空格,对字符没有lowcase化,不支持中文,并且不对生成的词汇单元进行其他的标准化处理.

  • language分词器

    特定语言的分词器,不支持中文.

3. 使用中文分词器elasticsearch-analysis-ik

IK中文分词器是目前使用比较多的分词器,下面我们来配置一下IK分词器的使用

因为我们使用的Docker容器技术启动的es,所以配置中文分词器IK就不能使用以前的方式.

  1. 下载和ES版本对应的IK分词器

    IK下载地址

    上面的地址里面有各种版本的IK分词器下载,我们只需要找到对应的版本,复制他们的ZIP版本的下载链接,比如我使用的是:https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.7.1/elasticsearch-analysis-ik-6.7.1.zip

  2. 进入ES容器,使用上面的下载地址,在ES容器中下载IK分词器

    #进入ES容器
    docker exec -it es bash
    #下载IK分词器
    wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.7.1/elasticsearch-analysis-ik-6.7.1.zip
    #进入ES容器中的plugins文件夹
    cd plugins
    #创建ik文件夹
    mkdir ik
    #将下载的ZIP文件移动到ik文件夹,然后解压,删除zip即可
    

至此就完成了IK分词器的配置.

4. 使用Kibana实现文档的增删改查

安装了Kibana以后,我们可以通过Kibana的管理界面中的开发工具来对ES进行操作:

在这里插入图片描述

①. 创建索引

在Kibana的Dev tools中输入:

#创建指定数量和发片的索引index1
PUT /index1/
{
  "settings": {
    "index":{
        "number_of_shards": 3,
        "number_of_replicas": 0
    }
  }
}
#直接创建一个默认配置的索引index2
PUT index2
#查看index1索引的配置信息
GET /index1/_settings
#查看所有索引的配置信息:
GET _all/_settings
②. 添加文档
#我们在上一步的基础上在索引index1中添加一个文档
#如果用PUT方式,需要指定文档的id,在这里是1
#put语法的格式: PUT /索引/类型/文档ID
PUT /index1/users/1
{
  "name" : "张三",
  "age" : 30,
  "about" : "我喜欢踢足球",
  "interests" : [ "music" ]
}
#如果不想自己指定ID,让ElasticSearch自己生成,即用POST方式添加
POST /index1/users/
{
  "name" : "王五",
  "age" : 35,
  "about" : "我是王五",
  "interests" : [ "music" ]
}
③. 查看文档
#查看刚才添加的文档,需要指定文档id
GET /index1/1
#如果我们只想查看文档中的某个属性的内容,比如查看name和about:
GET /index1/users/1?_source=name,about
④. 更新文档
  1. 使用PUT命令覆盖原来的文档信息

    #对前面添加的id为1的文档进行覆盖,使其年龄变为40
    PUT /index1/users/1
    {
      "name" : "张三",
      "age" : 40,
      "about" : "我喜欢踢足球",
      "interests" : [ "music" ]
    }
    
  2. 使用POST命令只修改对应的文档属性

    #格式:POST /索引/类型/文档id/_update
    #这里的_update是es提供的命令,可以对指定的文档属性进行修改,要修改的属性名放在doc中.
    POST /index1/users/1/_update
    {
      "doc": {
        "age":80
      }
    }
    
⑤. 删除文档&索引
#删除文档时指定文档ID
DELETE /index1/users/
#删除索引
DELETE /index2
5. 使用ES提供的MultiGet批量获取文档

ElasticSearch提供了MultiGetAPI来批量获取文档,可以基于curl命令获取,也在客户端工具中使用下面的方式来获取.

我们在Kibana中使用一下方式批量获取文档:

#使用GET命令,以及_mget代表批量获取文档,在命令中的docs属性中指明要获取的文档所在的索引、类型和文档ID
GET /_mget
{
  "docs":[
    {
      "_index":"index1",
      "_type":"users",
      "_id":"1"
    },
    {
      "_index":"index1",
      "_type":"users",
      "_id":"2"
    },
    {
      "_index":"index1",
      "_type":"users",
      "_id":"3"
    }
  ]
}

也可以在批量获取的时候,指定返回某个文档的具体一个字段

#也可以在批量获取的时候,指定返回某个文档的具体一个字段
GET /_mget
{
  "docs":[
    {
      "_index":"index1",
      "_type":"users",
      "_id":"1",
      "_source":["name"]
    },
    {
      "_index":"index1",
      "_type":"users",
      "_id":"2",
      "_source":["name","age"]
    },
    {
      "_index":"index1",
      "_type":"users",
      "_id":"3",
      "_source":["about"]
    }
  ]
}

获取同索引同类型下的不同文档

GET /index1/users/_mget
{
  "docs":[
    {
      "_id":1
    },  
    {
      "_id":2,
      "_source":["age","about"]
    }
  ]
}

也可以简化命令,指定文档id即可批量获取:

#批量获取文档id为1,2,3的文档
GET /index1/users/_mget
{
  "ids":[1,2,3]
}
6. 使用Bulk API实现批量操作

前面我们使用MultiGet只能批量的获取文档,ES还提供了BulkAPI来对文档进行批量的更新、删除等操作.

首先,bulk的格式:

{action:{metadata}}
{requestbody}

action代表行为,有以下几个选择:

  • create: 文档不存在时创建
  • update: 更新文档
  • index: 创建新文档或替换已有文档
  • delete: 删除一个文档

如果数数据存在,使用create操作会失败,且提示文档已存在;使用index则可以成功执行.

metadate代表操作的数据,有_index_type_id三种

在Kibana上使用bulk API如下:

添加操作:

#下面的是在index2所以的books类型中添加了三个文档
POST /index2/books/_bulk
{"index":{"_id":1}}
{"name":"java","price":50}
{"index":{"_id":2}}
{"name":"PHP","price":100}
{"index":{"_id":3}}
{"name":"C++","price":150}

修改和删除:

POST _bulk
{"create":{"_index":"index1","_type":"users","_id":11}}
{"name":"张11"}
{"update":{"_index":"index2","_type":"books","_id":3}}
{"doc":{"price":250}}
{"delete":{"_index":"index1","_type":"users","_id":1}}

总结

以上就是在Kibana中使用不同的API来操作文档和索引,在使用的时候,一定要注意各种命令的格式,避免写错.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值