GET /_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat": 40.8,
              "lon": -74.
            },
            "bottom_right": {
              "lat": 40.7,
              "lon": -73.
            }
          }
        }
      }
    }
  },
  "aggs": {
    "restaurants": {
      "geo_distance": {
        "field": "location",
        "origin": "40.7,-74",
        "unit": "km",
        "ranges": [
          {
            "from": 1,
            "to": 10
          },
          {
            "from": 10,
            "to": 50
          },
          {
            "from": 50,
            "to": 100
          },
          {
            "from": 100,
            "to": 500
          }
        ]
      }
    }
  }
}

这个Elasticsearch查询语句使用了地理边界框来限制搜索范围,并使用地理距离聚合来分析该范围内各个距离区间内的文档数量。这对于开发者需要了解特定地理区域内基于距离的数据聚合场景非常有用。

在Elasticsearch中,可以使用metrics聚合来对数据执行各种统计计算。以下是一些常见的指标聚合以及如何用Elasticsearch查询语言(Query DSL)来表示它们的示例。

  1. 平均值聚合(Avg Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "avg_grade": {
      "avg": {
        "field": "grade"
      }
    }
  }
}
  1. 最小值聚合(Min Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "min_grade": {
      "min": {
        "field": "grade"
      }
    }
  }
}
  1. 最大值聚合(Max Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "max_grade": {
      "max": {
        "field": "grade"
      }
    }
  }
}
  1. 求和聚合(Sum Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "total_grade": {
      "sum": {
        "field": "grade"
      }
    }
  }
}
  1. 求方差聚合(Extended Stats Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "grades_stats": {
      "extended_stats": {
        "field": "grade"
      }
    }
  }
}
  1. percentiles聚合(Percentiles Aggregation):



GET /_search
{
  "size": 0,
  "aggs": {
    "grade_percentiles": {
      "percentiles": {
        "field": "grade",
        "percents": [1, 5, 25, 50, 75, 95, 99]
      }
    }
  }
}

这些查询将返回指定的统计信息,例如平均分、最高分、最低分、总分、扩展统计信息(包括方差等)以及分数的各个百分位数。




{
  "persistent": {
    "discovery.seed_hosts": "127.0.0.1,127.0.0.2",
    "cluster.initial_master_nodes": "node-1,node-2"
  }
}

这个JSON配置文件设置了Elasticsearch集群的发现机制和集群初始主节点。discovery.seed_hosts 列出了集群中可能用来发现新节点的主机地址。cluster.initial_master_nodes 指定了集群启动时就已知的节点,这些节点将被选举为master节点。在生产环境中,这些地址应该是集群中所有节点的实际IP或主机名。

在Elasticsearch中,磁盘水位线(Disk watermark)是一个参考点,用于决定是否可以接受分片的磁盘使用情况。磁盘水位线由低到高分为三层:

  1. flood stage:磁盘使用率超过85%时,Elasticsearch会拒绝所有的写操作以防止数据丢失。
  2. high:磁盘使用率超过 90% 时,Elasticsearch会开始拒绝单个索引的写操作。
  3. low:磁盘使用率低于 75% 时,Elasticsearch会尝试从远程分片来恢复数据。

磁盘水位线可以在集群、索引或者节点级别进行配置。以下是一个设置磁盘水位线的例子:




PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.flood_stage": "99.5%",
    "cluster.routing.allocation.disk.watermark.high": "99%",
    "cluster.routing.allocation.disk.watermark.low": "90%"
  }
}

这个例子中,我们设置了集群的磁盘水位线:

  • flood_stage 为99.5%,表示磁盘使用率超过99.5%时,拒绝所有写操作。
  • high 为99%,表示磁盘使用率超过99%时,开始限制写操作。
  • low 为90%,表示磁盘使用率低于90%时,开始尝试恢复数据。

请注意,磁盘水位线的设置应该根据集群的实际情况来调整,以确保数据的可靠性和性能的平衡。

在Elasticsearch中,加权平均聚合(Weighted Average Aggregation)可以通过weighted_avg聚合实现。这个聚合能够让你对文档中的字段进行加权平均计算。

以下是一个使用weighted_avg聚合的例子:




GET /exams/_search
{
  "size": 0,
  "aggs": {
    "weighted_average_grade": {
      "weighted_avg": {
        "value": {
          "field": "grade"
        },
        "weight": {
          "field": "work_time"
        }
      }
    }
  }
}

在这个例子中,value是要计算平均值的字段,weight是计算平均值时所依据的权重字段。这个查询将返回grade字段的加权平均值,权重由work_time字段的值决定。

请注意,weight字段必须是数值型的,并且在使用时要确保它代表了合适的权重。此外,size设置为0是因为我们不需要获取文档,只需要聚合结果。

在Elasticsearch中,要使用最小值聚合,可以使用min聚合。以下是一个使用Elasticsearch的REST API的例子,它展示了如何对特定字段应用最小值聚合。

假设我们有一个名为logs的索引,并且我们想要找到response_time字段的最小值。




POST /logs/_search
{
  "size": 0,
  "aggs": {
    "min_value": {
      "min": {
        "field": "response_time"
      }
    }
  }
}

在这个查询中,size设置为0表示我们不需要返回任何文档,因为我们只关心聚合结果。aggs部分定义了一个名为min_value的最小值聚合,它使用min聚合器并指定fieldresponse_time

执行这个查询将返回如下结果:




{
  ...
  "aggregations": {
    "min_value": {
      "value": 100,
      "value_as_string": "100ms"
    }
  }
}

在这个结果中,aggregations.min_value.value将给出response_time字段的最小值。

Elasticsearch 是一个基于 Apache Lucene 的搜索和分析引擎,它使你能够快速,近乎实时地存储,搜索和分析大量数据。

以下是在 Linux 系统上安装 Elasticsearch 的步骤:

  1. 导入 Elastic 公钥:



wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
  1. 添加 Elasticsearch 到 apt 源列表:



sudo sh -c 'echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elastic-7.x.list'
  1. 安装 Elasticsearch:



sudo apt-get update && sudo apt-get install elasticsearch
  1. 启动 Elasticsearch 服务:



sudo systemctl start elasticsearch.service
  1. 设置 Elasticsearch 开机自启:



sudo systemctl enable elasticsearch.service
  1. 验证安装是否成功:



curl -X GET "localhost:9200/"

以上步骤适用于基于 Debian 的系统,如 Ubuntu。对于其他操作系统,请参考 Elastic 官方文档中的安装指南。

Elasticsearch 桶聚合(Bucket Aggregation)允许我们创建用于分组文档的桶。桶聚合可以包含其他的聚合,比如统计聚合、范围聚合等。

以下是一个基于Elasticsearch DSL语言的桶聚合示例,假设我们有一个记录销售商品信息的Elasticsearch索引,我们想要根据商品的品牌对销售数据进行分组:




GET /sales/_search
{
  "size": 0,
  "aggs": {
    "brands": {
      "terms": {
        "field": "brand",
        "size": 10
      },
      "aggs": {
        "sales_per_brand": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

在这个例子中,brands是桶聚合的名称,terms指定了我们要进行的桶聚合类型(词频),field指定了用于分桶的字段(品牌),size指定了返回的桶的最大数目。sales_per_brand是一个子聚合,它计算每个品牌的总销售额。size参数设置为10,表示我们只想要Top 10的品牌。"size": 0意味着我们不需要返回任何文档,只关心聚合结果。

Elasticsearch 配置通常在 elasticsearch.yml 文件中设置。以下是一些常见配置设置的例子:

  1. 设置节点名称:



node.name: node1
  1. 设置数据和日志路径:



path.data: /path/to/data
path.logs: /path/to/logs
  1. 设置网络相关配置,包括绑定的IP地址和端口:



network.host: 192.168.1.1
http.port: 9200
  1. 设置集群名称:



cluster.name: my-cluster
  1. 设置节点是否有资格被选为主节点:



node.master: true
  1. 设置节点是否存储数据:



node.data: true
  1. 设置初始主节点列表,用于集群初始化:



discovery.seed_hosts: ["host1", "host2"]
  1. 设置内存分配:



bootstrap.memory_lock: true
  1. 设置索引的分片和副本数量:



index.number_of_shards: 3
index.number_of_replicas: 2

这些配置项可以根据你的需求进行调整。在修改配置后,你需要重启 Elasticsearch 服务以使更改生效。

Elasticsearch 的平均聚合(Avg Aggregation)可以用来计算一组数值的平均值。以下是一个使用Elasticsearch DSL(Domain Specific Language)的Python例子,使用Elasticsearch的平均聚合功能。

假设我们有一个名为logs的索引,并且我们想要计算字段response_time的平均值。




from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
 
# 初始化Elasticsearch客户端
es = Elasticsearch("http://localhost:9200")
 
# 使用Elasticsearch DSL定义搜索
s = Search(using=es, index="logs")
 
# 添加平均聚合
s = s.aggregation('avg_response_time', 'avg', field='response_time')
 
# 执行搜索并获取结果
response = s.execute()
 
# 获取平均值
avg_response_time = response.aggregations.avg_response_time.value
print(f"平均响应时间: {avg_response_time} 毫秒")

这段代码首先导入了必要的Elasticsearch模块,然后创建了一个Elasticsearch客户端,定义了一个针对logs索引的搜索对象,并添加了一个平均聚合(avg)来计算response_time字段的平均值。最后,执行搜索并打印出计算出的平均响应时间。