Elasticsearch (ES)文档笔记

首先来说它能干嘛(引用官方):

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

为什么使用它?
暂不详细说明,他是搜索界的大哥,百度就是在他的基础上研发的。

官方中文介绍:https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.html

怎么用?
1.先让我了解下ES认知(index,type,doc)
index: 索引,可以理解为mysql的库
type: 类型, 可以理解为mysql的表 7.0开始被废弃
doc: 文档,可以理解为mysql表里面的记录
PS: 7.0开始type被废弃,现在有一个新的概念,index可以理解为一个类型(type)
2.先小试牛刀
如题: 我们受雇于 Megacorp 公司,作为 HR 部门新的 “热爱无人机” (“We love our drones!”)激励项目的一部分,我们的任务是为此创建一个员工目录。该目录应当能培养员工认同感及支持实时、高效、动态协作,因此有一些业务需求:

  • 支持包含多值标签、数值、以及全文本的数据
  • 检索任一员工的完整信息
  • 允许结构化搜索,比如查询 30 岁以上的员工
  • 允许简单的全文搜索以及较复杂的短语搜索
  • 支持在匹配文档内容中高亮显示搜索片段
  • 支持基于数据创建和管理分析仪表盘

来一个简单能运行的(查询整个es的数据)
GET _search
{
    “query”:{
        “match_all”:{

        }
    }
}

PUT /employee/_doc/1
{
    “first_name”:“John”,
    “last_name”:“Smith”,
    “age”:25,
    “about”:“I love to go rock climbing”,
    “interests”:[
        “sports”,
        “music”
    ]
}

PUT /employee/_doc/2
{
    “first_name”:“Jane”,
    “last_name”:“Smith”,
    “age”:32,
    “about”:“I like to collect rock albums”,
    “interests”:[
        “music”
    ]
}

PUT /employee/_doc/3
{
    “first_name”:“Douglas”,
    “last_name”:“Fir”,
    “age”:35,
    “about”:“I like to build cabinets”,
    “interests”:[
        “forestry”
    ]
}

match代表= 字段空格是or的关系

GET /employee/_search
{
    “query”:{
        “match”:{
            “first_name”:“TEXT Douglas”
        }
    },
    “size”:1,
    “sort”:[
        {
            “age”:{
                “order”:“desc”
            }
        }
    ],
    “from”:0
}

match_phrase代表= 字段空格是and的关系

GET /employee/_search
{
    “query”:{
        “match_phrase”:{
            “first_name”:“TEXT Douglas”
        }
    },
    “size”:1,
    “sort”:[
        {
            “age”:{
                “order”:“desc”
            }
        }
    ],
    “from”:0
}

bool->must代表多个条件or

bool->must代表多个条件and

GET /employee/_search
{
    “query”:{
        “bool”:{
            “should”:[
                {
                    “match”:{
                        “first_name”:“TEXT”
                    }
                },
                {
                    “match”:{
                        “first_name”:“Douglas”
                    }
                }
            ]
        }
    },
    “size”:1,
    “sort”:[
        {
            “age”:{
                “order”:“desc”
            }
        }
    ],
    “from”:0
}

GET /employee/_search
{
    “query”:{
        “bool”:{
            “must”:[
                {
                    “match”:{
                        “first_name”:“TEXT”
                    }
                },
                {
                    “match”:{
                        “first_name”:“Douglas”
                    }
                }
            ]
        }
    },
    “size”:1,
    “sort”:[
        {
            “age”:{
                “order”:“desc”
            }
        }
    ],
    “from”:0
}

bool->must_not代表多个否定条件

查询first_name没有TEXT又没有Douglas的数据

GET /employee/_search
{
    “query”:{
        “bool”:{
            “must_not”:[
                {
                    “match”:{
                        “first_name”:“TEXT”
                    }
                },
                {
                    “match”:{
                        “first_name”:“Douglas”
                    }
                },
                {
                    “range”:{
                        “age”:{
                            “gte”:10,
                            “lte”:20
                        }
                    }
                }
            ]
        }
    },
    “size”:1,
    “sort”:[
        {
            “age”:{
                “order”:“desc”
            }
        }
    ],
    “from”:0
}

聚合(准备数据)

POST /cars/_bulk
{ “index”: {}}
{ “price” : 10000, “color” : “red”, “make” : “honda”, “sold” : “2014-10-28” }
{ “index”: {}}
{ “price” : 20000, “color” : “red”, “make” : “honda”, “sold” : “2014-11-05” }
{ “index”: {}}
{ “price” : 30000, “color” : “green”, “make” : “ford”, “sold” : “2014-05-18” }
{ “index”: {}}
{ “price” : 15000, “color” : “blue”, “make” : “toyota”, “sold” : “2014-07-02” }
{ “index”: {}}
{ “price” : 12000, “color” : “green”, “make” : “toyota”, “sold” : “2014-08-19” }
{ “index”: {}}
{ “price” : 20000, “color” : “red”, “make” : “honda”, “sold” : “2014-11-05” }
{ “index”: {}}
{ “price” : 80000, “color” : “red”, “make” : “bmw”, “sold” : “2014-01-01” }
{ “index”: {}}
{ “price” : 25000, “color” : “blue”, “make” : “ford”, “sold” : “2014-02-12” }

使用的聚合简单的查询 !!字段必须用.keyword

GET /cars/_search
{
    “size”:0,
    “aggs”:{
        “cars_count”:{
            “terms”:{
                “field”:“color.keyword”
            }
        }
    }
}

查询每种颜色的车的平均价格

GET /cars/_search
{
    “size”:0,
    “aggs”:{
        “cars_color_count”:{
            “terms”:{
                “field”:“color.keyword”
            },
            “aggs”:{
                “price_avg”:{
                    “avg”:{
                        “field”:“price”
                    }
                }
            }
        }
    }
}

持续更新~ ,这段时间太忙了