Elasticsearch 备忘清单

这是 Elasticsearch 的官方文档。 你可以在这里找到 elasticsearch 的所有文档。

Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并作为看源软件发布。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

入门

入门

安装介绍

下载
  • 注意

    version 需替换为指定版本

    官方包有的功能只能试用,完整功能需要付费,请仔细阅读官网文档。

  • windows

    下载地址:

    https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-windows-x86_64.zip

  • linux

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-linux-x86_64.tar.gz
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-linux-x86_64.tar.gz.sha512
    shasum -a 512 -c elasticsearch-${VERSION}-linux-x86_64.tar.gz.sha512 
    tar -xzf elasticsearch-${VERSION}-linux-x86_64.tar.gz
    cd elasticsearch-${VERSION}/
    
  • macos

    curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-darwin-x86_64.tar.gz
    curl https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-darwin-x86_64.tar.gz.sha512 | shasum -a 512 -c - 
    tar -xzf elasticsearch-${VERSION}-darwin-x86_64.tar.gz
    cd elasticsearch-${VERSION}/ 
    

启动

  • 启动 Elasticsearch

    $ ./bin/elasticsearch
    
  • 设置密码

    export ELASTIC_PASSWORD="your_password"
    
  • 测试是否启动成功

    curl --cacert $ES_HOME/config/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200 
    

    成功则返回样例如下:

    {
        "name" : "Cp8oag6",
        "cluster_name" : "elasticsearch",
        "cluster_uuid" : "AT69_T_DTp-1qgIJlatQqA",
        "version" : {
            "number" : "${VERSION}",
            "build_type" : "tar",
            "build_hash" : "f27399d",
            "build_flavor" : "default",
            "build_date" : "2016-03-30T09:51:41.449Z",
            "build_snapshot" : false,
            "lucene_version" : "9.10.0",
            "minimum_wire_compatibility_version" : "1.2.3",
            "minimum_index_compatibility_version" : "1.2.3"
        },
        "tagline" : "You Know, for Search"
    }
    

elasticsearch 和 RDMS 的对比

RDMSelasticsearch
数据库(database)索引(index)
表(table)类型(type)
行(row)文档(document)
列(column)字段(field)
表结构映射
索引全文索引
SQL查询DSL
SELECT * FROM tablenameGET http://...
UPDATE table SETPUT http://...
DELETEDELETE http://...

操作

说明:

1. 以 user_info 为索引名称,类比数据库,
2. 字段有 id,username,password,nickname,age,info,remark 为例进行演示。

DSL语法

基础语法规则

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

  • VERB HTTP 方法:GET, POST, PUT, HEAD, DELETE

  • PROTOCOL:http 或者 https 协议(只有在 Elasticsearch 前面有 https 代理的时候可用)

  • HOST:Elasticsearch 集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫 localhost

  • PORT:Elasticsearch HTTP 服务所在的端口,默认为 9200

  • PATH API 路径(例如_count 将返回集群中文档的数量),PATH:可以包含多个组件,例如_cluster/stats 或者_nodes/stats/jvm

  • QUERY_STRING:一些可选的查询请求参数,例如?pretty 参数将使请求返回更加美观易读的 JSON 数据

  • BODY:一个 JSON 格式的请求主体(如果请求需要的话)

索引的操作

创建索引

  • 统一请求 api 前缀

    http://localhost:9200/

  • DSL语法

    PUT /user_info
    {
        "settings": {
            "number_of_replicas": 1,
            "number_of_shards": 1
        },
        "mappings": {
            "properties": {
                "id": {
                    "type": "long",
                    "index": true
                },
                "username": {
                    "type": "keyword",
                    "index": true
                },
                "nickname": {
                    "type": "keyword",
                    "index": true
                },
                "password": {
                    "type": "keyword",
                    "index": false
                },
                "age": {
                    "type": "integer",
                    "index": true
                },
                "info": {
                    "type": "text",
                    "index": true
                },
                "remark": {
                    "type": "text",
                    "index": true
                }
            }
        }
    }
    
  • curl

    curl -XPUT "http://localhost:9200/user_info" -H 'Content-Type: application/json' -d'{ "settings": { "number_of_replicas": 1, "number_of_shards": 1 }, "mappings": { "properties": { "id": { "type": "long", "index": true }, "username": { "type": "keyword", "index": true }, "nickname": { "type": "keyword", "index": true }, "password": { "type": "keyword", "index": false }, "age": { "type": "integer", "index": true }, "info": { "type": "text", "index": true }, "remark": { "type": "text", "index": true } } } }'
    
  • 参数说明:

    settings:索引信息设置

    number_of_shards:每个索引的主分片数,这个配置在索引创建后不能修改

    number_of_replicas:每个主分片的副本数,这个配置可以随时修改。

    mappings:索引映射定义

    properties:字段定义 properties里是json配置,key为字段名称(自定义名称),value是个嵌套json,type是指定字段的类型。

    -- 其他参数很多,请参考官网资料

删除索引

  • DSL语法

    DELETE /user_info
    
  • curl

    curl -XDELETE "http://localhost:9200/user_info"
    

判断索引是否存在

  • DSL语法

    # 查看索引是否存在
    HEAD /user_info
    
  • curl

    # 查看索引是否存在
    curl -XHEAD "http://localhost:9200/user_info"
    

开启/关闭索引

  • 开启DSL语法

    # 开启索引
    POST /user_info/_open
    
  • curl

    # 开启索引
    curl -XPOST "http://localhost:9200/user_info/_open"
    
  • 关闭DSL语法

    # 关闭索引
    POST /user_info/_close
    
  • curl

    # 关闭索引
    curl -XPOST "http://localhost:9200/user_info/_close"
    

索引的别名

  • 添加别名DSL语法

    # 添加别名
    POST /user_info/_alias/user1
    
  • 添加别名curl

    # 添加别名
    curl -XPOST "http://localhost:9200/user_info/_alias/user1"
    
  • 删除别名DSL语法

    # 删除别名
    DELETE /user_info/_alias/user1
    
  • 删除别名curl

    # 删除别名
    curl -XDELETE "http://localhost:9200/user_info/_alias/user1"
    
  • 查看别名DSL语法

    # 查看别名
    GET /_alias/user1
    
  • 查看别名curl

    # 查看别名
    curl -XGET "http://localhost:9200/_alias/useraa"
    

mapping 操作

类似修改数据库中列的操作

查看 mapping

  • DSL语法

    # 查看mapping
    GET /user_info/_mapping
    
  • curl

    # 查看mapping
    curl -XGET "http://localhost:9200/user_info/_mapping"
    

新增 mapping

  • 注意

    需要注意的是字段映射只能增加,不能更改删除

  • DSL语法

    # 新增mapping 
    PUT /user_info/_mapping
    {
        "properties":{
            "sex":{
                "type":"keyword"
            }
        }
    }
    
  • curl

    # 新增mapping 
    curl -XPUT "http://localhost:9200/user_info/_mapping" -H 'Content-Type: application/json' -d'{ "properties":{ "sex":{ "type":"keyword" } } }'
    

文档的操作

添加文档

  • DSL语法

    # 新增一条数据
    POST /user_info/_doc/1
    {
        "id":1,
        "username":"username",
        "password":"123456",
        "nickname":"nickname",
        "age":18,
        "info":"一些个人相关的介绍",
        "remark":"备注信息",
        "sex":"男"
    }
    
  • curl

    # 新增一条数据
    curl -XPOST "http://localhost:9200/user_info/_doc/1" -H 'Content-Type: application/json' -d'{ "id":1, "username":"username", "password":"123456", "nickname":"nickname", "age":18, "info":"一些个人相关的介绍", "remark":"备注信息", "sex":"男" }'
    

查询指定索引的所有文档

  • 类似数据库中的 select * from user_info;

  • DSL语法

    GET /user_info/_search
    {
        "query": {
            "match_all": {}
        }
    }
    
  • curl

    curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "match_all": {} } }'
    

通过 id 查询文档

  • 类似数据库中的 select * from user_info where id = 1;

  • DSL语法

    # 通过id查询
    GET /user_info/_doc/1
    
  • curl

    # 通过id查询
    curl -XGET "http://localhost:9200/user_info/_doc/1"
    

通过条件查询文档

精确查找

  • 类似数据库中的 select * from user_info where username = 'username';

  • DSL语法

    # 通过条件查询
    GET /user_info/_search
    {
        "query": {
            "bool": {
                "must": [
                    { "term": { "username": "username" } }
                ]
            }
        }
    }
    
  • curl

    # 通过条件查询
    curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "must": [ { "term": { "username": "username" } } ] } } }'
    

模糊查找

  • 类似数据库中的模糊查询 select * from user_info where info like '%人%';

  • DSL语法

    # 模糊查找
    GET /user_info/_search
    {
        "query": {
            "match": {
            "info": "人"
            }
        }
    }
    

范围查找

  • 类似数据库中的范围查询 select * from user_info where age between 18 and 30;

  • DSL语法

    GET /user_info/_search
    {
        "query": {
            "range": {
                "age": {
                    "gt": 18,
                    "lt": 30
                }
            }
        }
    }
    
  • curl

    curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "range": { "age": { "gt": 18, "lt": 30 } } } }'
    

limit 查找

  • 类似数据库中的 limit 查询 select * from user_info limit 10;

  • DSL语法

    GET /user_info/_search  
    {  
        "size": 10,  
        "query": {  
            "match_all": {}     
        }
    }
    
  • curl

    curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "size": 1, "query": { "match_all": {} } }'
    

limit offset 查找

  • 类似数据库中的 limit 查询 select * from user_info limit 0,10;

  • DSL语法

    GET /user_info/_search  
    {  
        "size": 2,  
        "from": 1,  
        "query": {  
            "match_all": {}  
        }  
    }
    
  • curl

    curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "size": 2, "from": 1, "query": { "match_all": {} } }'
    
  • 参数说明

    • "size": 10表示我们想要返回的结果数量是10条。
    • "from": 20表示我们想要从结果集中的第21条记录开始返回(因为偏移是从0开始的)。
    • "query": {"match_all": {}} 是一个匹配所有文档的查询,因为我们没有特定的查询条件,只是想要分页结果。

and 查询

  • 类似数据库中的 and 查询 select * from user_info where age > 18 and sex = '男';

  • DSL语法

    GET /user_info/_search  
    {  
        "query": {
            "bool": {
                "must": [
                    { "range": { "age": { "gt": 18 } } },
                    { "term": { "sex": "男" } }
                ]   
            }
        }
    }
    
  • curl

    curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "must": [ { "range": { "age": { "gt": 17 } } }, { "term": { "sex": "男" } } ] } } }'
    

or 查询

  • 类似数据库中的 or 查询 select * from user_info where age > 18 or sex = '男';

  • DSL语法

    GET /user_info/_search
    {
        "query": {
            "bool": {
            "should": [
                {
                    "range": {
                        "age": {
                            "gt": 18
                        }
                    }
                },
                {
                    "term": {
                        "sex": "男"
                    }
                }
            ]
            }
        }
    }
    
  • curl

    curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "should": [ { "range": { "age": { "gt": 18 } } }, { "term": { "sex": "男" } } ] } } }'
    

删除文档

删除指定 id

  • 类似数据库中的 delete 查询 delete from user_info where id = 3;

  • DSL语法

    # 删除文档
    DELETE /user_info/_doc/3
    
  • curl

    # 删除文档
    curl -XDELETE "http://localhost:9200/user_info/_doc/3"
    

删除指定条件

  • 类似数据库中的 delete 查询 delete from user_info where age > 18;

  • DSL语法

    POST /user_info/_delete_by_query
    {
        "query": {
            "range": {
                "age": {
                    "gt": 18
                }
            }
        }
    }
    
  • curl

    curl -XPOST "http://localhost:9200/user_info/_delete_by_query" -H 'Content-Type: application/json' -d'{"query":{"range":{"age":{"gt":18}}}}'