Elasticsearch是基于Lucene开发的搜索引擎,也是近几年很火的全文搜索引擎,具有部署方便、运行稳定、搜索高效等特点,且支持分布式部署,易于扩展。本文对于近期学习的知识做下梳理。

基本概念

  • 集群(cluster):一个整体的Elasticsearch服务
  • 节点(node):构成集群的每个服务节点
  • 索引(index):文档的集合,类似数据库的db
  • 文档(document):索引文件的最小单元,类似数据库的行数据
  • 分片|副本(Shards & Replicas):部分数据的集合,一个文档通常会存储在多个副本中(分布式)

Elasticsearch 是 面向文档的,意味着它存储整个对象或文档。Elasticsearch 不仅存储文档,而且索引每个文档的内容使之可以被检索。在 Elasticsearch 中,你对文档进行索引、检索、排序和过滤--而不是对行列数据。这是一种完全不同的思考数据的方式,也是 Elasticsearch 能支持复杂全文检索的原因。
Elasticsearch 使用 JavaScript Object Notation 或者 JSON 作为文档的序列化格式。

实践

命令语法:

<HTTP Verb> /<Index>/<Type>/<ID>  
http操作/索引/类型/文档ID  
  • 集群状态
    • 查看集群健康度 GET /_cat/health?v
    • 查看节点状态 GET /_cat/nodes?v
    • 查看索引状态 GET /_cat/indices?v
  • 创建|删除索引
    • 创建索引 PUT /mycollect?pretty
    • 删除索引 DELETE /mycollect?pretty
  • 文档操作

    • 添加文档 PUT /mycollect/_doc/1?pretty {"name": "agui"} 支持put|post方式更新数据
    • 查看文档 GET /mycollect/_doc/1
    • 更新文档 支持put|post方式更新数据

      PUT /mycollect/_doc/1?pretty {"name": "agui","age":"32"}

      PUT /mycollect/_doc/1/_update?pretty {"script" : "ctx._source.age += 5"}

  • 搜索数据

    • 导入数据集(样例)

      curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_doc/_bulk?pretty&refresh" --data-binary "@accounts.json"

    • REST API方式搜索

      GET /bank/_search?q=*&sort=account_number:asc&pretty

    • REQUEST BODY方式搜索,支持更灵活的条件设定和筛选

      GET /bank/_search { "query": { "match_all": {} }, "sort": [ { "account_number": "asc" } ] }

    • Query DSL查询
GET /_search  
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}

练习:中文搜索

参考链接:

1.官方文档https://www.elastic.co/guide/en/elasticsearch/reference/6.6/index.html

2.阮一峰教程http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html