Elasticsearch day01

Elasticsearch day01

1 Elasticsearch

1.1 Elasticsearch简介

应用开发中一个比较常见的功能是搜索,传统应用的解决方案:数据库的模糊查询。模糊查询存在的问题:

  • 海量数据下效率低下
  • 功能不够丰富:不够智能、不能高亮

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎。能够在海量的结构化和非结构化的数据中进行快速搜索,帮助我们完成诸如 订单搜索、商品推荐、日志分析、性能监控 等功能。

和Elasticsearch类似的产品还有Apache组织开源的Solr ,Solr和Elasticsearch都是基于Lucene这个Java类库二次开发而成的框架。Solr在功能性、传统搜索应用方面的表现更好,Elasticsearch则在新兴的实时搜索表现更佳。Solr的发展一直都比较平稳,近些年来呈现渐渐的下降趋势,而Elasticsearch则呈现明显上升的趋势。

Elasticsearch的特点:

  • Elasticsearch是基于Lucene(Java全文检索工具)的开发的搜索引擎
  • Elasticsearch支持分布式,多用户访问,可以轻松的扩展到上百台服务器
  • Elasticsearch是近实时的不是实时的搜索引擎,简单说插入一条新数据后并不能保证立刻搜索到,但保证在1s内一定可以搜索到
  • Elasticsearch通过简单的RESTful API来隐藏Lucene的复杂性,使得全文检索变得简单
  • Elasticsearch使用JSON格式存储数据

1.2 Elasticsearch的安装

克隆一个安装好jdk环境的linux系统

  1. 修改配置文件limits.conf

    vi /etc/security/limits.conf

    在最后一行添加下面内容
    * soft nofile 65536
    * hard nofile 65536
    * soft nproc  4096
    * hard nproc  4096
    
  2. 修改sysctl.conf

    vi /etc/sysctl.conf

    最后一行添加
    vm.max_map_count=262144
    

    运行该命令让sysctl生效

    sysctl -p

  3. 把es安装包上传到opt文件夹里面进行解压,tar -zxvf elasticsearch-6.4.1.tar.gz

  4. 修改es的配置文件允许远程访问

    [root@localhost config]# vi elasticsearch.yml 
    将55行
    #network.host: 192.168.0.1 
    改为:
    network.host: 0.0.0.0 
    

    注意去除前面的#

  5. 尝试启动es:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h4GgG83L-1630977897595)(Elasticsearch day01.assets/image-20210618103018743.png)]

    es不能使用root用户启动。我们需要添加其他用户。

  6. 添加es用户,修改es文件夹的所属用户为es,elasticsearch不能使用root用户启动。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VkciylLW-1630977897599)(Elasticsearch day01.assets/image-20210305142204372.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTMc0xCm-1630977897600)(Elasticsearch day01.assets/image-20210618103815915.png)]

    所以我们需要通过linux的权限命令对文件夹进行修改所属用户。

  7. 使用es用户登录到linux里面,启动es

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WaofZBHM-1630977897602)(Elasticsearch day01.assets/image-20210305142431321.png)]

2 Elasticsearch起步

2.1 REST 回顾

REST(Resource Representational State Transfer)资源在网络传输中以某种表现形式进行状态转移

REST风格的URI:

  • 面向资源
  • 通过HTTP的请求方式对资源进行操作

HTTP请求方式:

  • GET 对资源的查询
  • POST 对资源的新增或者更新
  • PUT 对资源的更新或者新增
  • DELETE 对资源的删除

2.2 RESTful API操作Elasticsearch

Elasticsearch数据相关的概念:

  • 文档:json格式的数据,类似关系型数据库的一行数据。每个文档都会有唯一的id,可以由es生成,也可以由程序员指定
  • 字段:每一个文档中的数据字段就相当于关系型数据库中一行的列
  • 类型:Elasticsearch中保存数据的容器,类似于MySQL中的表
  • 索引:保存有类型,类似于mysql的数据库。
序号Elasticsearchmysql
1索引
2类型
3文档
4字段

为方便大家前期对Elasticsearch的数据有一个大体的认识,可以类比关系型数据库的一些概念,但注意2者之间有本质差别不可等价齐观。

2.3 创建和删除索引

创建索引和类型:

PUT  /索引名
{
  "mappings":{
     "类型名":{
          "properties":{
              "字段名":{
                 "type":"字段类型"
			  },
              "字段名":{
                 "type":"字段类型"
			  }
           }
       }
   }
}    

文档中字段的类型

字符串:keyword,text

数值类型:long,integer,short,byte,double,float

布尔:boolean

日期:date

二进制:binary

案例:

PUT http://192.168.132.109:9200/dang

{
  "mappings":{
     "book":{
          "properties":{
              "name":{ 
                "type":"text"
			  },
              "price":{
                 "type":"double"
			  }
           }
       }
   }
}    

查看索引:

#查看索引
GET /索引名/_mappings
示例:
GET http://192.168.146.40:9200/dang/_mappings

结果:

{
    "dang": {
        "mappings": {
            "book": {
                "properties": {
                    "name": {
                        "type": "text"
                    },
                    "price": {
                        "type": "double"
                    }
                }
            }
        }
    }
}

删除索引:

#删除索引
DELETE /索引名
示例:
DELETE http://192.168.132.108:9200/dang
#删除所有索引
DELETE http://192.168.132.108:9200/*

结果:

{
    "acknowledged": true
}

2.4 操作文档

  1. 添加文档

    操作:

    示例:
    POST http://192.168.232.109:9200/dangdang/news/2
    
    {
        "title":"新闻标题2",
        "content":"新闻内容2"
    }
    其中id也可以不添加,系统会自动给我们创建一个id值
    

    结果:

    #由es分配id
    {
        "_index": "dangdang",
        "_type": "news",
        "_id": "z1sqAXgBNdZS7uufAQRX",
        "_version": 1,
     "result": "created",
        "_shards": {
         "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 0,
        "_primary_term": 1
    }
    
    #指定文档的id
    {
        "_index": "dangdang",
        "_type": "news",
        "_id": "2",
        "_version": 1,
        "result": "created",
        "_shards": {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 1,
        "_primary_term": 1
    }
    
  2. 查询文档

    操作:

    #查看文档(数据):
    GET /索引/类型/id值
    
    示例:
    GET http://192.168.232.109:9200/dangdang/news/_search  查看全部
    GET http://192.168.232.109:9200/dangdang/news/1   查看id为1的数据
    

    结果:

    #查询全部
    {
        "took": 5,
        "timed_out": false,
        "_shards": {
            "total": 5,
            "successful": 5,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": 2,
            "max_score": 1.0,
            "hits": [
                {
                    "_index": "dangdang",
                    "_type": "news",
                    "_id": "z1sqAXgBNdZS7uufAQRX",
                    "_score": 1.0,
                    "_source": {
                        "title": "新闻标题3",
                        "content": "新闻内容3"
                    }
                },
                {
                    "_index": "dangdang",
                    "_type": "news",
                    "_id": "2",
                    "_score": 1.0,
                    "_source": {
                        "title": "222",
                        "content": "2222"
                    }
                }
            ]
        }
    }
    
    #根据 id 查询
    {
        "_index": "dangdang",
        "_type": "news",
        "_id": "2",
        "_version": 2,
        "found": true,
        "_source": {
            "title": "222",
            "content": "2222"
        }
    }
    
  3. 删除文档

    操作:

    #删除文档(数据):
    DELETE /索引/类型/id
    
    示例:
    DELETE http://192.168.232.109:9200/dangdang/news/1
    

    结果:

    {
        "_index": "dangdang",
        "_type": "news",
        "_id": "_doc",
        "_version": 2,
        "result": "deleted",//删除成功
        "_shards": {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 2,
        "_primary_term": 1
    }
    
  4. 更新文档

    操作:

    #更新文档
    POST /索引/类型/id
    {
        "title":"222",
        "content":"2222"
    }
    
    示例:
    POST http://192.168.232.109:9200/dangdang/news/2
    
    {
        "title":"222",
        "content":"2222"
    }
    

2.5 Elasticsearch的其他命令

查看es里面现存的所有索引

GET http://192.168.232.109:9200/_cat/indices?v
结果:
health status index    uuid                   pri rep docs.count docs.deleted store.size 
yellow open   dangdang siHMxmNyTqyzm8pyhVghVg   5   1          2            0      7.8kb 

索引、类型、映射这些组成可以由ES通过文档反推,也可以主动创建。在我们不创建索引和类型的情况下也可以直接插入文档数据。

在没有es1和book的情况下我们可以插入一个文档。
POST http://192.168.232.109:9200/es1/book/1
{
    "name":"aa",
    "price":200
}

4 批量操作

4.1 批量写 _bulk

Bulk API支持在一次请求中,可以对任意的索引执行多种不同的写操作。

语法:
PUT /_bulk
{操作类型以及操作的索引 类型 文档id信息}
{操作用到的数据}
{操作类型以及操作的索引 类型 文档id信息}
{操作用到的数据}
...

操作类型: index和create都是创建,区别是如果相同id的文档存在,index会覆盖,create会报错
         update:更新
		 delete:删除

示例
PUT http://192.168.146.40:9200/_bulk

{"index":{"_index":"dangdang","_type":"book","_id":"1"}}
{"bookName":"红楼梦","author":"曹雪芹","price":19800.0}
{"update":{"_index":"dangdang","_type":"book","_id":"1"}}
{"doc":{"price":"1980.0"}}
{"create":{"_index":"dangdang","_type":"book","_id":"2"}}
{"bookName":"水浒传","author":"施耐庵"}
{"delete":{"_index":"dangdang","_type":"book","_id":"3"}}

//注意最后必须添加一个空行

注意:

  • json数据不能主动换行,必须写成一行
  • 多个json间必须要换行
  • 在文件中json串最后一行下方必须再有一个空行

扩展:

如果在URI路径上指定了索引和类型,那么操作时json串中的条件可以省略对应的值,上面的操作也可以写成如下所示:

PUT http://192.168.146.40:9200/dangdang/book/_bulk
{"index":{"_id":"1"}}
{"bookName":"红楼梦","author":"曹雪芹","price":19800.0}
{"index":{"_id":"1"}}
{"doc":{"price":"1980.0"}}
{"create":{"_id":"2"}}
{"bookName":"水浒传","author":"施耐庵"}
{"delete":{"_id":"3"}}

操作中单条操作的失败,不会影响其它操作。返回结果中包含了每一条操作的结果。

4.2 批量读取_mget

可以一次性的查询多个数据,减少网络连接产生的开销,提高性能。

#批量获取
GET /_mget
{
    "docs":[
        {索引 类型 等信息},
        ...
    ]
}
示例:
GET http://192.168.146.40:9200/_mget

{
  "docs":[
    {"_index":"dangdang",
      "_type":"book",
      "_id":1
    },
    {
      "_index":"dangdang",
      "_type":"book",
      "_id":2
    }
    ]
}

如果在URI路径上指定了索引和类型,那么操作时json串中的条件可以省略对应的值,上面的操作也可以写成如下所示:

GET http://192.168.146.40:9200/dangdang/book/_mget

{
  "docs":[
    {"_id":1},
    {"_id":2}
  ]
}

数据,减少网络连接产生的开销,提高性能。

#批量获取
GET /_mget
{
    "docs":[
        {索引 类型 等信息},
        ...
    ]
}
示例:
GET http://192.168.146.40:9200/_mget

{
  "docs":[
    {"_index":"dangdang",
      "_type":"book",
      "_id":1
    },
    {
      "_index":"dangdang",
      "_type":"book",
      "_id":2
    }
    ]
}

如果在URI路径上指定了索引和类型,那么操作时json串中的条件可以省略对应的值,上面的操作也可以写成如下所示:

GET http://192.168.146.40:9200/dangdang/book/_mget

{
  "docs":[
    {"_id":1},
    {"_id":2}
  ]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值