zoukankan      html  css  js  c++  java
  • ELasticsearch用法

    Elasticsearch使用手册

    介绍

    Elasticsearch 是一个由Java编写、基于全文搜索引擎库 Apache Lucene™ 的开源搜索引擎,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,提供一套简单一致的 RESTful API。特性:

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

     

    面向文档:

    在 Elasticsearch 中,你 对文档进行索引、检索、排序和过滤--而不是对行列数据。这是一种完全不同的思考数据的方式,也是 Elasticsearch 能支持复杂全文检索的原因。

    使用

    索引:

    存储数据到 Elasticsearch 的行为叫做 索引 ,但在索引一个文档之前,需要确定将文档存储在哪里。一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。

    路径:路径 /megacorp/employee/1 包含了三部分的信息:

    Megacorp:索引名称,employee:类型名称,1:特定雇员的ID

    增删改查

    1)增:PUT /megacorp/employee/1

    {

        "first_name" : "John",

        "last_name" :  "Smith",

        "age" :        25,

        "about" :      "I love to go rock climbing",

        "interests": [ "sports", "music" ]

    }

     

    2)删: DELETE 

    3)改/更新:只需再次 PUT 

    4)查询是否存在: HEAD 指令来

    5)搜索:

    请求体查询:参数在请求体中

    参考https://www.elastic.co/guide/cn/elasticsearch/guide/current/full-body-search.html

     “轻量查询”:参数在查询的url中

    参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/search-lite.html

    表达式搜索
    索引文档基本用法
    索引单个文档:

    curl -X GET "localhost:9200/megacorp/employee/1"

    一个 HTTP GET 请求并指定文档的地址——索引库、类型和ID。 使用这三个信息可以返回原始的 JSON 文档

    返回:

    返回结果包含了文档的一些元数据,以及 _source 属性,内容是 John Smith 雇员的原始 JSON 文档:

    {

      "_index" :   "megacorp",

      "_type" :    "employee",

      "_id" :      "1",

      "_version" : 1,

      "found" :    true,

      "_source" :  {

          "first_name" :  "John",

          "last_name" :   "Smith",

          "age" :         25,

          "about" :       "I love to go rock climbing",

          "interests":  [ "sports", "music" ]

      }

    }

    检索搜索列表

    curl -X GET "localhost:9200/megacorp/employee/_search"

    结果返回:

    Took:耗时

    Timed_out:是否超时

    _shards:多少个分片被搜索,_shards:描述了查询分片的信息,查询了多少个分片、成功的分片数量、失败的分片数量等

    Hits:搜索结果,hits:搜索的结果,total是全部的满足的文档数目,hits是返回的实际数目(默认是10)

                     Hits.total – 匹配的文档总数

                     Hits.hits – 真正的搜索结果数据

    _score是文档的分数信息,

    {
       "took":      6,//
       "timed_out": false,
       "_shards": { ... },
       "hits": {
          "total":      3,
          "max_score":  1,
          "hits": [
             {
                "_index":         "megacorp",
                "_type":          "employee",
                "_id":            "3",
                "_score":         1,
                "_source": {
                   "first_name":  "Douglas",
                   "last_name":   "Fir",
                   "age":         35,
                   "about":       "I like to build cabinets",
                   "interests": [ "forestry" ]
                }
             },
             {
                "_index":         "megacorp",
                "_type":          "employee",
                "_id":            "1",
                "_score":         1,
                "_source": {
                   "first_name":  "John",
                   "last_name":   "Smith",
                   "age":         25,
                   "about":       "I love to go rock climbing",
                   "interests": [ "sports", "music" ]
                }
             },….}

    返回结果包括了所有三个文档,放在数组 hits 中。一个搜索默认返回十条结果。

    表达式搜索
    GET /megacorp/employee/_search
    {
        "query" : {
            "match" : {
                "last_name" : "Smith"
            }
        }
    }

    可在表达式搜索中添加filteroolean等条件组成负责搜索

    全文搜索

    全文搜索 字段文本匹配, 仅匹配同时包含 “rock”  “climbing”

    GET /megacorp/employee/_search
    {
        "query" : {
            "match" : {
                "about" : "rock climbing"
            }
        }
    }

    返回存在相关度得分:

    {
                ...
                "_score":         0.016878016, 
                "_source": {
                   "first_name":  "Jane",
                   "last_name":   "Smith",
                   "age":         32,
                   "about":       "I like to collect rock albums",
                   "interests": [ "music" ]
                }
    短语搜索

    精确匹配,同时含有rock和climbing

    "match_phrase" : { "about" : "rock climbing"}

    仅匹配同时包含 “rock”  “climbing” ,

    GET /megacorp/employee/_search
    {
        "query" : {
            "match_phrase" : {
                "about" : "rock climbing"
            }
        }
    高亮搜索
    查询后添加highlight字段,标识该文档符合查询条件
    "highlight": {
            "fields" : {
                "about" : {}
            }
    索引类型
    1.空搜索 GET /_search

    2.多索引,多类型

    /gb,us/user,tweet/_search

    在 gb 和 us 索引中搜索 user 和 tweet 类型

    /_all/user,tweet/_search

    在所有的索引中搜索 user 和 tweet 类型

    3.分页 GET /_search?size=5&from=10

    Size:显示应该返回的结果数量,默认是 10

    From:显示应该跳过的初始结果数量,默认是 0

    注意:先集中排序(分片的结果)后分页

    4.轻量搜索要求在查询字符串中传递所有的 参数
    (通过一个URL参数来传递查询信息给搜索接口)
       GET /megacorp/employee/_search?q=last_name:Smith
    详情见:https://www.elastic.co/guide/cn/elasticsearch/guide/current/search-lite.html
     
    复杂搜索
    结构化搜索

    结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程。比如日期、时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作。比较常见的操作包括比较数字或时间的范围,或判定两个值的大小。

    精确查询

    当进行精确值查找时,使用过滤器(filters),它们执行速度非常快,不会计算相关度(直接跳过了整个评分阶段)而且很容易被缓存。

    1. term查询 可以用它处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)。
    GET /my_store/products/_search
    {
        "query" : {
            "constant_score" : { 
                "filter" : {
                    "term" : { 
                        "price" : 20
                    }
                }
            }
        }
    }
    constant_score模式查询以非评分模式

    内部过滤器:

    在内部,Elasticsearch 会在运行非评分查询的时执行多个操作:

    1. 查找匹配文档.

    term 查询在倒排索引中查找 XHDK-A-1293-#fJ3 然后获取包含该 term 的所有文档。本例中,只有文档 1 满足我们要求。

    1. 创建 bitset.

    过滤器会创建一个 bitset (一个包含 0 和 1 的数组),它描述了哪个文档会包含该 term 。匹配文档的标志位是 1 。本例中,bitset 的值为 [1,0,0,0] 。在内部,它表示成一个 "roaring bitmap",可以同时对稀疏或密集的集合进行高效编码。

    1. 迭代 bitset(s)

    一旦为每个查询生成了 bitsets ,Elasticsearch 就会循环迭代 bitsets 从而找到满足所有过滤条件的匹配文档的集合。执行顺序是启发式的,但一般来说先迭代稀疏的 bitset (因为它可以排除掉大量的文档)。

    1. 增量使用计数.

    Elasticsearch 能够缓存非评分查询从而获取更快的访问,但是它也会不太聪明地缓存一些使用极少的东西。非评分计算因为倒排索引已经足够快了,所以我们只想缓存那些我们 知道 在将来会被再次使用的查询,以避免资源的浪费。

    为了实现以上设想,Elasticsearch 会为每个索引跟踪保留查询使用的历史状态。如果查询在最近的 256 次查询中会被用到,那么它就会被缓存到内存中。当 bitset 被缓存后,缓存会在那些低于 10,000 个文档(或少于 3% 的总索引数)的段(segment)中被忽略。这些小的段即将会消失,所以为它们分配缓存是一种浪费。

     

    组合过滤器

    SELECT product

    FROM   products

    WHERE  (price = 20 OR productID = "XHDK-A-1293-#fJ3")

      AND  (price != 30)
    布尔过滤器:一个 bool 过滤器由三部分组成:

    {

       "bool" : {

          "must" :     [],

          "should" :   [],

          "must_not" : [],

       }

    }

    Must:所有的语句都 必须(must 匹配,与 AND 等价。

    must_not:所有的语句都 不能(must not 匹配,与 NOT 等价。

    Should:至少有一个语句要匹配,与 OR 等价。

    Bool可以嵌套多个bool过滤器

    参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/combining-filters.html

    查找多个精确值:

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/_finding_multiple_exact_values.html

    范围range

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/_ranges.html

    处理空值

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/_dealing_with_null_values.html

    处理缓存:

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/filter-caching.html

    全文搜索

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/full-text-search.html

    多字段搜索

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/multi-field-search.html

    近似匹配

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/multi-field-search.html

    部分匹配

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/multi-field-search.html

    控制相关度

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/controlling-relevance.html

    聚合:

    需要明白两个主要的概念:

    桶(Buckets

    满足特定条件的文档的集合,类似于Group by,桶也可以被嵌套在其他桶里面,提供层次化的或者有条件的划分方案

    指标(Metrics

    对桶内的文档进行统计计算,类似于countmaxsum等

     

    SELECT COUNT(color)  FROM table GROUP BY color

     

    COUNT(color) 相当于指标。

     

    GROUP BY color 相当于桶。

    简单聚合:哪个颜色的汽车销量最好
    GET /cars/transactions/_search
    {
        "size" : 0,
        "aggs" : { 
            "popular_colors" : { 
                "terms" : { 
                  "field" : "color"
                }
            }
        }
    }
     

    聚合操作被置于顶层参数 aggs /  aggregations 。

     

    然后,可以为聚合指定一个我们想要名称,本例中是: popular_colors 。

     

    最后,定义单个桶的类型 terms 。

    size 设置成 0 。我们并不关心搜索结果的具体内容,所以将返回记录数设置为 0 来提高查询速度。

    结果:

    {

    ...

       "hits": {

          "hits": []

       },

       "aggregations": {

          "popular_colors": {

             "buckets": [

                {

                   "key": "red",

                   "doc_count": 4

                },

                {

                   "key": "blue",

                   "doc_count": 2

                },

                {

                   "key": "green",

                   "doc_count": 2

                }

             ]

          }

       }

    }

     

    因为我们设置了 size参数,所以不会有 hits 搜索结果返回。

     

    popular_colors 聚合是作为 aggregations 字段的一部分被返回的。

     

    每个桶的 key 都与 color 字段里找到的唯一词对应。它总会包含 doc_count 字段

    告诉我们包含该词项的文档数量。

     

    每个桶的数量代表该颜色的文档数量。

    查询条件+聚合:

    度量+聚合:

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/_adding_a_metric_to_the_mix.html

    2)简单聚合:哪个颜色的汽车销量最好

    GET /cars/transactions/_search
    {
        "size" : 0,
        "query" : {
            "match_all" : {}
        },
        "aggs" : {
            "colors" : {
                "terms" : {
                  "field" : "color"
                }
            }
        }
    }

    例子3:度量

    过滤+聚合:

    因为聚合是在查询结果范围内操作的,任何可以适用于查询的过滤器也可以应用在聚合上。

    到聚合—》条形图

    明日: 地理位置

    原理

    ElasticSearch 的主旨是随时可用和按需扩容。 而扩容可以通过购买性能更强大( 垂直扩容 ,或 纵向扩容) 或者数量更多的服务器( 水平扩容 ,或 横向扩容 )来实现。El倾向于横向扩容,为集群添加更多的节点。

    Elasticsearch 尽可能地屏蔽了分布式系统的复杂性。这里列举了一些在后台自动执行的操作:

    • 分配文档到不同的容器 或 分片 中,文档可以储存在一个或多个节点中
    • 按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
    • 复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失
    • 将集群中任一节点的请求路由到存有相关数据的节点
    • 集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复

    一个运行中的 Elasticsearch 实例称为一个 节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。

    当一个节点被选举成为  节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主节点。

    作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的。

     

    1. 集群健康:

    GET /_cluster/health

    status 字段指示着当前集群在总体上是否工作正常。它的三种颜色含义如下:

    green所有的主分片和副本分片都正常运行。

    yellow所有的主分片都正常运行,但不是所有的副本分片都正常运行。

    red有主分片没能正常运行。

    1. 索引:

     索引 —— 保存相关数据的地方。 索引实际上是指向一个或者多个物理 分片 的 逻辑命名空间 。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。

    PUT /blogs

    {

       "settings" : {

          "number_of_shards" : 3,

          "number_of_replicas" : 1

       }

    }

     

  • 相关阅读:
    Spring Mvc和Mybatis的多数据库访问配置过程
    Git下解决冲突
    安装Git
    数据库优化
    Ubuntu版 微信
    ssh框架简介
    写代码的习惯
    CentOS 7 安装 docker 并搭建私有仓库
    IPv4地址分类及特征
    Xcode 7.0 Could not find developer disk image
  • 原文地址:https://www.cnblogs.com/lingli-meng/p/10156225.html
Copyright © 2011-2022 走看看