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" : {}
        }
    }
}
原文地址:https://www.cnblogs.com/ntbww93/p/9794905.html