zoukankan      html  css  js  c++  java
  • Elasticsearch入门和基本使用

    1. 什么是Elasticsearch?

    Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统;Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。用于快速存储,搜索和海量数据分析;

    2. Elasticsearch的优点

    1)横向可扩展性:只需要增加一台机器,添加一些配置即可;

    2)分片机制提供很好的分布性:同一个索引有多个分片(sharding);

    3)高可用:提供复制机制。一个分片就可以设置多个复制;

    4)使用简单:一条命令就可以下载文件,快速搭建一个站内搜溹引擎;

    3. Elasticsearch的特点

    1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司;

    2)Elasticsearch主要是将全文检索、数据分析以及分布式技术,合并在了一起,形成了独一无二的ES;

    3)对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂;

    4)全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;这是传统数据库是做不到的,Elasticsearch作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能;

    4. Elasticsearch的功能

    1)分布式的搜索引擎和数据分析引擎

    2)全文检索,结构化检索,数据分析

          全文检索:我想搜索商品名称包含牙膏的商品,select * from products where product_name like "%牙膏%"
          结构化检索:我想搜索商品分类为日化用品的商品都有哪些,select * from products where category_id='日化用品'
          数据分析:我们分析每一个商品分类下有多少个商品,select category_id,count(*) from products group by category_id

    3)对海量数据进行近实时的处理

    分布式:ES自动可以将海量数据分散到多台服务器上去存储和检索;
    海量数据的处理:分布式以后,就可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理了;
    近实时:在秒级别对数据进行搜索和分析;检索个数据要花费1小时--离线批处理,batch-processing;

    5. Elasticsearch的核心概念

    1)Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级;

    2)Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常;

    3)Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群

    4)Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。document类似于数据库的行;

    5)Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。索引类似于SQL中的一个数据库;索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。

    6)Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。Type类似于数据库的表;

    7)shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。

    8)replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。

    6.Elasticsearch的安装

    1) 安装jdk1.8;

    2) 解压Elasticsearch的安装包;运行bin目录下的elasticsearch.bat;

    3) 检查ES是否启动成功:http://localhost:9200/?pretty

    name: node名称
    cluster_name: 集群名称(默认的集群名称就是elasticsearch)
    version.number: 5.2.0,es版本号

    4)解压Kibana安装包,他是开发界面操作es;

    5)启动Kibana:binkibana.bat;进入Dev Tools界面;

    6)GET _cluster/health

    7. Elasticsearch的基本使用

    1)面向文档的搜索分析引擎

    {
    "email": "aa@sina.com",
    "first_name": "a",
    "last_name": "a",
    "info": {
    "bio": "curious and modest",
    "age": 11,
    "interests": [ "b", "c" ]
    },
    "join_date": "2018/11/01"
    }

    2)快速检查集群的健康状况

    GET /_cat/health?v

    green:每个索引的primary shard和replica shard都是active状态的
    yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
    red:     不是所有索引的primary shard都是active状态的,部分索引有数据丢失了

    为什么现在会处于一个yellow状态?

    我们现在就一个笔记本电脑,就启动了一个es进程,相当于就只有一个node。现在es中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配5个primary shard和5个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动。

    3)快速查看集群中有哪些索引

    GET /_cat/indices?v

    4)简单的索引操作

    创建索引:PUT /test_index?pretty
    
    删除索引:DELETE /test_index?pretty

    5)商品的CRUD操作

    (1)新增商品:新增文档,建立索引
    
    PUT /index/type/id
    {
      "json数据"
    }
    
    PUT /ecommerce/product/1
    {
        "name" : "gaolujie yagao",
        "desc" :  "gaoxiao meibai",
        "price" :  30,
        "producer" :      "gaolujie producer",
        "tags": [ "meibai", "fangzhu" ]
    }
    
    es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索;
    
    (2)查询商品:检索文档
    GET /index/type/id
    
    GET /ecommerce/product/13.1)修改商品:替换文档
    
    PUT /ecommerce/product/1
    {
        "name" : "jiaqiangban gaolujie yagao",
        "desc" :  "gaoxiao meibai",
        "price" :  30,
        "producer" :      "gaolujie producer",
        "tags": [ "meibai", "fangzhu" ]
    }
    
    替换方式有一个不好,即必须带上所有的field,才能去进行信息的修改
    
    (3.2)修改商品:更新文档
    
    POST /ecommerce/product/1/_update
    {
      "doc": {
        "name": "jiaqiangban gaolujie yagao"
      }
    }
    
    (5)删除商品:删除文档
    
    DELETE /ecommerce/product/1

     8. Elasticsearch的几种查询方式

    1)query string search(用的少了)

    GET /索引名称/type名称/_search

    搜索全部商品:GET /ecommerce/product/_search

    GET /ecommerce/product/_search?q=name:yagao&sort=price:desc

    took:耗费了几毫秒
    timed_out:是否超时,
    _shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)
    hits.total:查询结果的数量
    hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
    hits.hits:包含了匹配搜索的document的详细数据

    2)query DSL

    DSL:Domain Specified Language,特定领域的语言

    查询所有的商品
    
    GET /ecommerce/product/_search
    {
      "query": { "match_all": {} }
    }
    
    查询名称包含yagao的商品,同时按照价格降序排序
    
    GET /ecommerce/product/_search
    {
        "query" : {
            "match" : {
                "name" : "yagao"
            }
        },
        "sort": [
            { "price": "desc" }
        ]
    }
    
    分页查询商品
    GET /ecommerce/product/_search
    {
      "query": { "match_all": {} },
      "from": 1,
      "size": 1
    }
    
    指定要查询出来商品的名称和价格就可以
    GET /ecommerce/product/_search
    {
      "query": { "match_all": {} },
      "_source": ["name", "price"]
    }

    3)query filter

    搜索商品名称包含yagao,而且售价大于25元的商品
    
    GET /ecommerce/product/_search
    {
        "query" : {
            "bool" : {
                "must" : {
                    "match" : {
                        "name" : "yagao" 
                    }
                },
                "filter" : {
                    "range" : {
                        "price" : { "gt" : 25 } 
                    }
                }
            }
        }
    }

    4)full-text search(全文检索)

    GET /ecommerce/product/_search
    {
        "query" : {
            "match" : {
                "producer" : "yagao producer"   //字段名:包含的文字
            }
        }
    }

    5)phrase search(短语搜索)

    要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回

    GET /ecommerce/product/_search
    {
        "query" : {
            "match_phrase" : {
                "producer" : "yagao producer"
            }
        }
    }

    6)highlight search(高亮搜索结果)

    GET /ecommerce/product/_search
    {
        "query" : {
            "match" : {
                "producer" : "producer"
            }
        },
        "highlight": {
            "fields" : {
                "producer" : {}
            }
        }
    }
  • 相关阅读:
    错误:Error:未定义标识符"_TCHAR"
    C#中DateTime应用
    随机打乱数组元素
    C++中的运算符重载
    C#中的运算符重载
    C#访问修饰符
    VS2010中将当前选定项目做为启动项
    VS2010 ctrl+F5闪退解决方法
    IntelliSense: 应输入声明的解决方案
    C++数据类型范围
  • 原文地址:https://www.cnblogs.com/ntbww93/p/9794905.html
Copyright © 2011-2022 走看看