Elasticsearch

根据b站视频整理笔记: https://www.bilibili.com/video/BV1Qz411e7yx?p=1

1、ElasticSearch简介

1.1、什么是ES

ES是使用java 语言并且基于Lucence编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于restful风格的web 接口。

lucence:一个搜索引擎底层

分布式:突出ES的横向扩展能力

全文检索:将一段词语进行分词,并将分出的词语统一的放在一个分词库中,再搜索时,根据关键字取分词库中检索,找到匹配的内容(倒排索引)。

restful风格的web 接口:只要发送一个http请求,并且根据请求方式的不同,携带参数的不同,执行相应的功能。

1.2、ES和Solr

1.solr 查询死数据,速度比es快。但是数据如果是改变的,solr查询速度会降低很多,ES的查询速度没有明显的改变

2.solr搭建集群 依赖ZK,ES本身就支持集群搭建

3.最开始solr 的社区很火爆,针对国内文档 少,ES出现后,国内社区火爆程度 上升,,ES的文档非常健全

4.ES对云计算和大数据支持很好

1.3、ES的由来小故事

许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。
在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。

直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。
他发布了他的第一个开源项目 Compass。

后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写
Compass,把它变为一个独立的服务并取名 Elasticsearch。

第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名
contributors(目前736名 contributors )。 一家公司已经开始围绕 Elasticsearch
提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。

据说,Shay 的妻子还在等着她的食谱搜索引擎…

1.4、ElasticSearch和Kibana

ElasticSearch是一个基于Lucence的搜索服务器。

Kibana是es的一个开源分析和可视化平台,主要用到 Dev Tools 和 Management。

2、ElasticSearch基本操作

2.1、操作ES的RESTful语法

GET请求:
	http://ip:port/index :查询索引信息
	http://ip:port/index/type/doc_id :查询指定的文档信息
POST请求:
    http://ip:port/index/type/_search: 查询文档,可以在请求体中添加json字符串来代表查询条件
    http://ip:port/index/type/doc_id/_update: 修改文档,在请求体中添加json字符串来代表修改的信息
PUT请求:
    http://ip:port/index : 创建一个索引,需要在请求体中指定索引的信息
    http://ip:port/index/type/_mappings:代表创建索引时,指定索引文档存储属性的信息
DELETE 请求:
    http://ip:port/index: 删除跑路
    http://ip:port/index/type/doc_id:  删除指定的文档

2.2、索引的创建、查看和删除

创建一个索引

#创建一个索引
#number_of_shards  分片
#number_of_replicas 备份
PUT /person
{
  "settings": {
    "number_of_shards": 5, 
    "number_of_replicas": 1
  }
}

查看一个索引

1.使用management。图形化界面

2.
#查看索引信息
GET /person

删除索引

1.management

2.
#删除索引
DELETE /person

3.4 、ES中Field可以指定的类型

字符串类型:
text: 一般用于全文检索,将当前field 进行分词
keyword:当前field 不会进行分词

数值类型:
long,Intger,short,byte,double,float,
half_float: 精度比float 小一半
scaled_float:根据一个long 和scaled 来表达一个浮点型 long-345, -scaled 100 ->3.45

时间类型:
date类型,根据时间类型指定具体的格式

二进制类型:
binary类型暂时支持Base64编码的字符串

范围类型:
integer_range:赋值时,无需指定具体的内容,只需存储一个范围即可,gte,lte,gt,lt,
float_range:同上
long_range:同上
double_range:同上
date_range:同上
ip_range:同上

经纬度类型:
geo_point:用来存储经纬度

IP类型:
ip:可以存储IPV4 和IPV6

创建索引并指定数据结构

#创建索引,指定数据类型
PUT /book
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1 
  },
    
  "mappings": {
   
      "properties": {
        "name": {
          "type": "text"
        },
        "author": {
          "type": "keyword"
        },
        "count": { 
          "type": "long"
        },
        "onSale": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "descr": {
          "type": "text"
        }
      }
    
  }
}

match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,
而term会直接对关键词进行查找。
一般模糊查找的时候,多用match,而精确查找时可以使用term。

term查询

term的查询是代表完全匹配,搜索之前不会对你的关键字进行分词

#term匹配查询
POST /sms_logs_index/sms_logs_type/_search
{
  "from": 0,   #limit  from,size
  "size": 5,
  "query": {
    "term": {
      "province": {
        "value": "河北"
      }
    }
  }
}
##不会对term中所匹配的值进行分词查询

terms是针对一个字段包含多个值得运用

  • terms: where province = 河北 or province = ? or province = ?
#terms 匹配查询
POST /sms_logs_index/sms_logs_type/_search
{
  "from": 0,
  "size": 5,
  "query": {
    "terms": {
      "province": [
        "河北",
        "河南"
      ]
    }
  }
}

match查询

match查询,实际底层就是多个term查询,将多个term查询的结果进行了封装

  • 查询的如果是日期或者是数值的话,它会根据你的字符串查询内容转换为日期或者是数值对等
  • 如果查询的内容是一个不可被分的内容(keyword),match查询不会对你的查询的关键字进行分词
  • 如果查询的内容是一个可被分的内容(text),match则会根据指定的查询内容按照一定的分词规则去分词进行查询
match_all查询

查询全部内容,不指定任何查询条件

POST /sms_logs_index/sms_logs_type/_search
{
  "query": {
    "match_all": {}
  }
}
match查询 根据某个Field
POST /sms_logs_index/sms_logs_type/_search
{
  "query": {
    "match": {
      "smsContent": "打车"
    }
  }
}
布尔match查询

基于一个Filed匹配的内容,采用and或者or的方式进行连接

# 布尔match查询
POST /sms_logs_index/sms_logs_type/_search
{
  "query": {
    "match": {
      "smsContext": {
        "query": "打车 女士",
        "operator": "and"   #or
      }
    }
  }
}
multi_match查询

match针对一个field做检索,multi_match针对多个field进行检索,多个key对应一个text

POST /sms_logs_index/sms_logs_type/_search
{
  "query": {
    "multi_match": {
      "query": "河北",  #指定text
      "fields": ["province","smsContext"] #指定field
    }
  }
}

filter 查询

query 查询:根据你的查询条件,去计算文档的匹配度得到一个分数,并根据分数排序,不会做缓存的。

filter 查询:根据查询条件去查询文档,不去计算分数,而且filter会对经常被过滤的数据进行缓存。

#filter 查询
POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "corpName": "海尔智家公司"
           }
        },
        {
          "range":{
            "fee":{
              "lte":50
            }
          }
        }
      ]
    }
  }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值