【elsticsearch】的使用场景深入详解

计算机单位换算

计算机的存储单位
位 bit (比特)(Binary Digits):存放一位二进制数,即 01,最小的存储单位。
字节 byte:8个二进制位为一个字节(B),最常用的单位。
计算机存储单位一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示,它们之间的关系是:
1KB (Kilobyte 千字节)=1024B----------------------------------------------------------------------- 1K=10^3千
1MB (Megabyte 兆字节 简称“兆”;万进级计数法中是“百万”字节;)=1024KB-----------1M=10^6兆
1GB (Gigabyte 吉字节 又称“千兆”;万进级计数法中是“十亿”字节)=1024MB------------1G=10^9吉
1TB (Terabyte 太字节;万进级计数法中是“兆”字节)=1024GB----------------------------1T=10^12太
1PB(Petabyte 拍字节;万进级计数法中是“千兆”字节)=1024TB-------------------------1P=10^15拍
1EB(Exabyte 艾字节;万进级计数法中是“百京”字节)=1024PB--------------------------1E=10^18艾
1ZB (Zettabyte 泽字节;万进级计数法中是“十垓”字节)= 1024 EB--------------------------1Z=10^21泽
1YB (Yottabyte 尧字节;万进级计数法中是“秭”字节)= 1024 ZB-----------------------------1Y=10^24尧
1BB (Brontobyte 万进级计数法中是“千秭”字节)= 1024 YB------------------------------------1BB=10^27

如果用数据库做搜索的结果

  • 会对全表进行查询,耗时
  • 不能对搜索词进行分开查询,尽可能的去查询更多你希望的结果

全文检索和lucene

全文检索

  • 倒排索引
    • 生化危机电影------生化-危机-电影
    • 生化危机海报------生化-危机-海报
    • 生化危机文章------生化-危机-文章
    • 生化危机新闻------生化-危机-新闻

关键字 | ids
—|—
生化 | 1 2 3 4
危机 | 1 2 3 4
电影 | 1
海报 | 2
文章 | 3
新闻 |4

lucene

  • 就是一个jar包,里面封装好了各种建立倒排索引的,以及进行搜索的代码,包含各种算法。用lucene时,我们就可以将已有数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结构,另外,我们也可以用lucene提供的功能和api来针对磁盘上建立的数据,进行搜索。

简介

是一种分布式全文搜索引擎,基于Lucene(全文搜索框架)开发而来。Lucene是公认的迄今为止的最好用的搜索引擎库,但是他所提供的API对于我们使用者来说,是非常苦恼的,常要花费大量时间去熟悉学习。ES的出现就很好的解决了这个问题,良好的封装,易用的API,链式书写方式,开瓶即饮。

功能

  • 分布式搜索引擎和数据分析引擎
  • 全文检索,数据检索,数据分析
    • select * from product where product_name like “%牙膏%”
    • select * from product where categroy_id = 1
    • 分析数据个数之类
  • 对海量数据进行实时处理

特点

  • 分布式实时文件存储,每个字段皆能索引、
  • 集群,可扩展(理论上无上限)
  • 高度集成的服务(RESTful风格的API,各语言客户端)
  • 易学易用,开瓶即饮
  • 自动维护数据分布到多个节点上建立索引,还将搜索请求分布到多个节点上执行。
  • 自动维护数据冗余副本,保证一些机器跌机不会丢失数据。
  • 封装了更多高级功能,为我们提供了过呢更多的高级支持,让我们快速开发应用,开发更复杂的应用,复杂的搜索功能,复杂的分析功能,基于地理位置的搜索。

下载安装

  • 官网地址
https://www.elastic.co/cn/downloads/elasticsearch
  • 安装JDk
  • 将压缩包解压,然后在解压后的目录下找到bin文件夹,点击名为elasticsearch.bat 文件运行,如果是中小型应用,数据小,开箱即用,直接开始就可以启动。
  • 测试是否安装成功:访问:http://localhost:9200/
   {
  "name" : "ZPp5rol",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "uzjbGwNQTSqRLN0G3v8i5Q",
  "version" : {
    "number" : "5.2.2",
    "build_hash" : "f9d9b74",
    "build_date" : "2017-02-24T17:26:45.835Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
   }
   name node名称
   version-number 版本号
  • 下载和解压Kibana的安装包
    https://www.elastic.co/cn/downloads/kibana
    
  • 启动kibanna bin\kibana.bat
  • 进入tools界面
    http://localhost:5601/app/kibana#/dev_tools/
    
  • 查看集群状态
    GET _cluster/health

document数据格式

面向文档的搜索分析引擎

  • 应用系统的数据结构都是面向对象的,复杂的
  • 对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相当麻烦
  • ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构,es可以提供复杂的索引,全文检索,分析聚合等功能
  • es的document用json数据格式来表达
{
"email":      "zhangsan@sina.com",
"first_name": "san",
"last_name": "zhang",
"info": {
    "bio":         "curious and modest",
    "age":         30,
    "interests": [ "bike", "climb" ]
},
"join_date": "2017/01/01"
}

简单的集群管理

  • 快速查看集群的健康状态

GET _cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1573993237 12:20:37 elasticsearch green 1 1 3 3 0 0 0 0 - 100.0%

  • 如何快速了解集群的健康状况?green、yellow、red?
    • green:每个索引的primary shard和replica shard都是active状态的
    • yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
    • red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
  • 查看索引的命令
    GET /_cat/indices?v
  • 创建索引的命令
    PUT /test_index?pretty
  • 删除索引
    DELETE /test_index?pretty

商品案列

添加商品数据

es会自动为其建立index和type,而且es默认会对document每个field都建立倒排索引,让其可以被搜索

  • 添加格式
Put /index/type/id
{
    json数据
}
  • 例子
PUT /ecommerce/product/1
{
   "name" : "gaolujie yagao",
   "desc" :  "gaoxiao meibai",
   "price" :  30,
   "producer" :      "gaolujie producer",
   "tags": [ "meibai", "fangzhu" ]
}

添加成功显示

{
 "_index" : "ecommerce",
 "_type" : "product",
 "_id" : "1",
 "_version" : 1,
 "result" : "created",
 "_shards" : {
   "total" : 2,
   "successful" : 1,
   "failed" : 0
 },
 "_seq_no" : 0,
 "_primary_term" : 1
}

PUT /ecommerce/product/2
{
   "name" : "jiajieshi yagao",
   "desc" :  "youxiao fangzhu",
   "price" :  25,
   "producer" :      "jiajieshi producer",
   "tags": [ "fangzhu" ]
}

PUT /ecommerce/product/3
{
   "name" : "zhonghua yagao",
   "desc" :  "caoben zhiwu",
   "price" :  40,
   "producer" :      "zhonghua producer",
   "tags": [ "qingxin" ]
}

查询数据

  • 查询格式
Get /index/type/id
  • 例子
Get /ecommerce/product/1
Get /ecommerce/product/2
Get /ecommerce/product/3

修改数据

  • 修改格式
Put /index/type/id
{
    json数据
}
  • 例子
PUT /ecommerce/product/1
{
    "name" : "dxd_product",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

删除数据

  • 删除格式
DELETE /index/type/id
  • 例子
DELETE /ecommerce/product/1

完整代码

PUT /test_index?pretty
GET /_cat/indices?v
DELETE /test_index?pretty


PUT /ecommerce/product/1
{
    "name" : "gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

PUT /ecommerce/product/2
{
    "name" : "jiajieshi yagao",
    "desc" :  "youxiao fangzhu",
    "price" :  25,
    "producer" :      "jiajieshi producer",
    "tags": [ "fangzhu" ]
}

PUT /ecommerce/product/3
{
    "name" : "zhonghua yagao",
    "desc" :  "caoben zhiwu",
    "price" :  40,
    "producer" :      "zhonghua producer",
    "tags": [ "qingxin" ]
}

GET /ecommerce/product/3


PUT /ecommerce/product/1
{
    "name" : "dxd_product",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

GEt /ecommerce/product/1

DELETE /ecommerce/product/1

查看所有商品数据

query string search

因为search参数都是以http请求的query

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

返回数据

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "ecommerce",
        "_type" : "product",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : "jiajieshi yagao",
          "desc" : "youxiao fangzhu",
          "price" : 25,
          "producer" : "jiajieshi producer",
          "tags" : [
            "fangzhu"
          ]
        }
      },
      {
        "_index" : "ecommerce",
        "_type" : "product",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "name" : "zhonghua yagao",
          "desc" : "caoben zhiwu",
          "price" : 40,
          "producer" : "zhonghua producer",
          "tags" : [
            "qingxin"
          ]
        }
      }
    ]
  }
}

带参数查询

string来附带的搜索商品名称中包含yagao,并且按照售价降序排序

GET /ecommerce/product/_search?q=name:yagao

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

query DSL

以json参数查询数据

DSL:Domain Specified Language 特定领域语言,可以定义请求体

GET /ecommerce/product/_search
{
 "query":{
   "match_all":{}
 } 
}

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"]
}

query filter

搜索name为yaogao,price大于25的

GET /ecommerce/product/_serach
{
  "query":{
    "bool":{
      "must":{
        "name":"yaogao"
      }
    }
  },
  "filter":{
    "range":{
      "price":{"gt":25}
    }
  }
}

full-text search(全文检索)

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

phrase search(短语搜索)

跟全文检索相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回
phrase search,要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回

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

计算每个tag下的商品数量

GET /ecommerce/product/_search
{
  "aggs":{
    "group_by_tages":{
      "terms":{"field":"tages"}
    }
  }
}

问题记录

  • 出现Kibana server is not ready yet
    • 注意查看elsticsearch 与kibana的版本是否一致
  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值