elasticsearch学习(1)简单查询与聚合

elastic

被用作全文搜索、结构化搜索、分析以及这三个功能的组合

  • 一个ElasticSearch集群可以包含多个索引,
  • 每个索引包含多个类型
  • 一个类型存储着多个文档
  • 每个文档又有多个属性

索引(名词)

  • 一个 索引 类似于传统关系数据库中的一个 数据库 , 是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或
    indexes 。

索引(动词)

  • 索引一个文档 就是存储一个文档到一个 索引 (名词) 中以便它可以被检索和查询到。 这非常类似于 SQL语句中的 INSERT 关键词, 除
    了文档已存在时新文档会替换旧文档情况之外

fliter

  • 高效的执行结构化查询

query

  • bool,match,must,about
  • example
GET /megacorp/employee/_search
{
"query" : {
    "match" : {
        "about" : "rock climbing"
                }
            }
}


GET /megacorp/employee/_search
{
"query" : {
    "bool": {
        "must": {
            "match" : {
                "last_name" : "smith"
                     }
                },
        "filter": {
            "range" : {
                "age" : { "gt" : 30 }
                        }
                    }
                }
            }
}
  • 全文搜索 about

相关性得分
Elasticsearch默认按照相关性得分排序, 即每个文档跟查询的匹配程度。

GET /megacorp/employee/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}
  • terms 相当于MySQL中的group_by
GET /megacorp/employee/_search
{
"aggs": {
    "all_interests": {
        "terms": { "field": "interests" }
        }
    }
}

聚合搜索

  • 桶 buckets 相当于MySQL的group
  • 指标 Metrics 相当于聚合函数,count、max、min
GET /cars/transactions/_search
{
    "size" : 0,
    "aggs": {
        "colors": {
            "terms": {
                "field": "color"
            },
            "aggs": {
                "avg_price": {
                    "avg": {
                        "field": "price"
                     }
                 }
            }
        }
    }
}
为度量新增 aggs 层。
为度量指定名字: avg_price 。
最后, 为 price 字段定义 avg 度量
  • 按照日期中的月份聚合
GET /cars/transactions/_search
{
    "size" : 0,
    "aggs": {
        "sales": {
            "date_histogram": {
            "field": "sold",
            "interval": "month",
            "format": "yyyy-MM-dd"
            }
        }
    }
}
时间间隔要求是日历术语 (如每个 bucket 1 个月
  • 处理返回数据时间间断
GET /cars/transactions/_search
{
    "size" : 0,
        "aggs": {
            "sales": {
                "date_histogram": {
                    "field": "sold",
                    "interval": "month",
                    "format": "yyyy-MM-dd",
                    "min_doc_count" : 0,
                    "extended_bounds" : {
                        "min" : "2014-01-01",
                        "max" : "2014-12-31"
                        }
                }
        }
    }
}
这个参数强制返回空 buckets。
这个参数强制返回整年。
  • cardinality 去重
GET /cars/transactions/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_colors" : {
            "cardinality" : {
                "field" : "color"
            }
        }
    }
} 
返回的结果表明已经售卖了三种不同颜色的汽车:
...
"aggregations": {
    "distinct_colors": {
                    "value": 3
                }
}

  • 文档元数据

    • _index 索引

    一个 索引 应该是因共同的特性被分组到一起的文档集合。 例如, 你可能存储所有的产品在索引 products 中, 而存储所有销售的交易到
    索引 sales 中。
    虽然也允许存储不相关的数据到一个索引中, 但这通常看作是一个反模式的做法。
    实际上, 在 Elasticsearch中, 我们的数据是被存储和索引在 分片 中, 而一个索引仅仅是逻辑上的命名空间, 这个命名空间由一个或者多
    个分片组合在一起。
    然而, 这是一个内部细节, 我们的应用程序根本不应该关心分片, 对于应用程序而言, 只需知道文档位于一个 索引
    内。 Elasticsearch会处理所有的细节

    • _type 类型

    数据可能在索引中只是松散的组合在一起, 但是通常明确定义一些数据中的子分区是很有用的。
    例如, 所有的产品都放在一个索引中,
    但是你有许多不同的产品类别, 比如 "electronics"、 "kitchen"和 "lawn-care"。

    这些文档共享一种相同的(或非常相似) 的模式: 他们有一个标题、 描述、 产品代码和价格。 他们只是正好属于“产品”下的一些子类。

    Elasticsearch公开了一个称为 types (类型) 的特性, 它允许您在索引中对数据进行逻辑分区。 不同 types 的文档可能有不同的字段, 但最好能够非常相似。

    • _id

    ID 是一个字符串, 当它和 _index 以及 _type 组合就可以唯一确定 Elasticsearch中的一个文档。
    当你创建一个新的文档, 要么提供自己
    的 _id , 要么让 Elasticsearch帮你生成。


posted @ 2018-07-31 16:38  Gary556  阅读(145)  评论(0)    收藏  举报