ElasticSearch

由 笔尖 发布

ES简介

java开发的企业最流行的搜索引擎。支持实时、稳定、可靠、快速搜索。客户端支持Java、Net、PHP、Python、Ruby等。

和Solr比较,如果是针对已有数据做搜索,则Solr更快,如果是实时建立搜索和搜索,则ES更快。

  • Solr需要Zk做分布式协调,ES自带分布式控制。
  • Solr支持多种格式,Json、XML、CSV,ES仅支持Json。
  • Solr传统应用性能更好,ES实时搜索性能更好。

与传统关系型数据库的对比。

image-20211221114756288

全文检索

针对文本中每一个分词,建立索引,保存该单词出现的位置。用户查询时,也将待查询文本拆开,在索引库中做查询,这种方式叫做倒排索引(根据内容找出现的索引下标),相对应的正排索引是根据id找内容。

倒排索引示意图

image-20211221115027082

核心概念

索引

一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引,类似于数据库。

映射

Mapping用来定义一个文档, mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分词器、是否被索引等等,这些都是映射里面可以设置的。

字段

数据表中的kv键值对

字段类型

如Text、Keyword、Byte等

文档

类似于一条记录

集群和节点

分片和副本

一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为解决该类问题,将索引划分为多份。帮助扩容和提升并行度。

副本与主节点分开存放,提升高可用,并行度。

安装

ES、客户端Kibana、IK分词器

常见分词器

POST _analyze
{
"analyzer":"standard",
"text":"我爱你中国"
}
#单子拆分,歧义
POST _analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国"
 }
#ik_smart:会做最粗粒度的拆分,即中华人名共和国
POST _analyze
{
"analyzer":"ik_max_word",
"text":"我爱你中国"
}
#ik_max_word:会将文本做最细粒度的拆分,最常见、智能的拆分方法

修改默认分词方法

PUT /school_index
{
"settings" : {
"index" : {
"analysis.analyzer.default.type": "ik_max_word"
        }
    }
}

ES数据基本操作

ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。
然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。
在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
ES使用JSON作为文档序列化格式。
JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。
ES存储的一个员工文档的格式示例:

{
"email": "584614151@qq.com",
"name": "张三",
 "age": 30,
 "interests": [ "篮球", "健身" ]
}

1) 创建索引

格式: PUT /索引名称

举例: PUT /es_db

2) 查询索引

格式: GET /索引名称

举例: GET /es_db

3) 删除索引

格式: DELETE /索引名称

举例: DELETE /es_db

4) 添加文档

格式: PUT /索引名称/类型/id

PUT /es_db/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园",
"remark": "java developer"
}
PUT /es_db/_doc/2
{
"name": "李四",
"sex": 1,
"age": 28,
"address": "广州荔湾大厦",
"remark": "java assistant"
}

5) 修改文档

格式: PUT /索引名称/类型/id
举例: 
PUT /es_db/_doc/1
{
"name": "白起老师",
"sex": 1,
"age": 25,
"address": "张家界森林公园",
"remark": "php developer assistant"                
}

PUT和POST

  • PUT需指明具体id,POST可不用(有则替换,无则创建)
  • PUT执行替换,POST执行更新

6) 查询文档

格式: GET /索引名称/类型/id 举例: GET /es_db/_doc/1

7) 删除文档

格式: DELETE /索引名称/类型/id 举例: DELETE /es_db/_doc/1

Restful操作

Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。 基于Restful API ES和所有客户端的交互都是使用JSON格式的数据。其他所有程序语言都可以使用RESTful API,通过9200端口的与ES进行通信。透明性,暴露资源存在,利用HTTP语义实现不同方式的操作。

  • GET查询
  • PUT添加
  • POST修改
  • DELE删除

查询

查询当前类型中的所有文档 _search

GET /es_db/_doc/_search

条件查询, 如要查询age等于28岁的 _search?q=

GET /es_db/_doc/_search?q=age:28

范围查询, 如要查询age在25至26岁之间的 _search?q=[ TO ] 注意: TO 必须为大写

GET /es_db/_doc/_search?q=age[25 TO 26]

根据多个ID进行批量查询 _mget

GET /es_db/_doc/_mget { "ids":["1","2"] }

查询年龄小于等于28岁的 :<=

GET /es_db/_doc/_search?q=age:<=28

分页查询 from=&size=

GET /es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1

对查询结果只输出某些字段 _source=字段,字段

GET /es_db/_doc/_search?_source=name,age

对查询结果排序 sort=字段:desc/asc

GET /es_db/_doc/_search?sort=age:desc

暂无评论

发表评论