在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 在生产环境中部署Elasticsearch:最佳实践和故障排除技巧——聚合与搜索(三)

聚合和分析

在Elasticsearch中执行聚合和度量操作可以帮助我们对数据进行更深入的分析。本文将介绍如何使用聚合和度量来执行复杂的数据分析操作,例如计数、平均值、百分位数和分组等。


执行聚合操作

1. 使用Java API执行聚合操作


可以使用Java API执行各种聚合操作。以下是使用RestHighLevelClient对象执行名为my_index的索引中的terms聚合操作的代码示例:

SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder aggregation =
    AggregationBuilders.terms("by_age").field("age");
sourceBuilder.aggregation(aggregation);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

以上代码使用SearchRequest对象和SearchSourceBuilder对象执行terms聚合操作,并按年龄字段分组。

2. 使用CURL命令执行聚合操作

也可以使用CURL命令执行各种聚合操作。以下是使用名为my_index的索引中的terms聚合操作检索所有文档的示例:

curl -XGET 'localhost:9200/my_index/_search?pretty' -H 'Content-Type: application/json' -d'
{
    "aggs" : {
        "by_age" : {
            "terms" : { "field" : "age" }
        }
    }
}
'

执行度量操作

1. 使用Java API执行度量操作

可以使用Java API执行各种度量操作。以下是使用RestHighLevelClient对象执行名为my_index的索引中的avg度量操作的代码示例:

SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
AvgAggregationBuilder aggregation =
    AggregationBuilders.avg("avg_age").field("age");
sourceBuilder.aggregation(aggregation);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);


以上代码使用SearchRequest对象和SearchSourceBuilder对象执行avg度量操作,并返回年龄字段的平均值。

2. 使用CURL命令执行度量操作

也可以使用CURL命令执行各种度量操作。以下是使用名为my_index的索引中的avg度量操作检索所有文档的示例:

curl -XGET 'localhost:9200/my_index/_search?pretty' -H 'Content-Type: application/json' -d'
{
    "aggs" : {
        "avg_age" : {
            "avg" : { "field" : "age" }
        }
    }
}
'


结论

本文介绍了如何使用聚合和度量来执行复杂的数据分析操作,例如计数、平均值、百分位数和分组等。使用Java API或CURL命令都可以对Elasticsearch索引中的数据进行聚合和度量操作,以便更好地理解和分析数据。在实际应用中,需要根据具体需求选择合适的聚合和度量操作来使用。

搜索性能优化

优化Elasticsearch的搜索性能是应用程序中非常重要的一部分。本文将介绍如何使用缓存、调整分片大小和数量,以及使用搜索建议等方式来优化Elasticsearch的搜索性能。

使用缓存

Elasticsearch中有两种类型的缓存:查询缓存和过滤器缓存。查询缓存为相同的查询结果提供快速的响应,而过滤器缓存则会缓存过滤器结果,以便在后续搜索中快速使用。以下是使用Java API启用过滤器缓存的代码示例:

SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("age", 30));
sourceBuilder.postFilter(QueryBuilders.termQuery("city", "New York"));
sourceBuilder.size(0);
sourceBuilder.aggregation(AggregationBuilders.avg("avg_age").field("age"));
sourceBuilder.aggregation(AggregationBuilders.terms("by_city").field("city"));
sourceBuilder.profile(true);
sourceBuilder.cache(true);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);


以上代码使用SearchSourceBuilder对象启用了过滤器缓存。

调整分片大小和数量


分片是Elasticsearch中数据的基本单元,并且将数据划分为多个分片可以使Elasticsearch更好地处理大型数据集。但是,如果分片过大或过小,都会影响搜索性能。以下是使用Java API设置索引分片数和备份数的代码示例:

CreateIndexRequest request = new CreateIndexRequest("my_index");
request.settings(Settings.builder()
        .put("index.number_of_shards", 5)
        .put("index.number_of_replicas", 1));

以上代码使用CreateIndexRequest对象设置名为my_index的索引的分片数为5,备份数为1。

使用搜索建议

搜索建议是Elasticsearch中一种重要的搜索优化技术。它可以在用户输入搜索查询时提供自动完成、拼写检查和相关性建议等功能。以下是使用Java API添加基于文本的完整推荐搜索建议的代码示例:

SearchRequest request = new SearchRequest("my_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
SuggestionBuilder termSuggestionBuilder =
    SuggestBuilders.termSuggestion("name").text("jonh");
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("suggest_name", termSuggestionBuilder);
sourceBuilder.suggest(suggestBuilder);
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

以上代码使用SearchSourceBuilder对象添加了一个基于文本的完整推荐搜索建议。

结论

本文介绍了如何使用缓存、调整分片大小和数量以及使用搜索建议等方法来优化Elasticsearch的搜索性能。使用这些技术可以提高搜索响应速度,并增强用户体验。在实际应用中,需要根据具体的搜索需求来选择合适的优化方式。


集群管理

配置和管理Elasticsearch集群是使大规模Elasticsearch应用程序成功运行的关键。本文将介绍如何进行节点发现、负载均衡和故障转移等操作来配置和管理Elasticsearch集群。


节点发现

节点发现是Elasticsearch中一个重要的概念,它允许新节点加入到已有的Elasticsearch集群中。以下是使用Java API启用节点发现功能的代码示例:

Settings settings = Settings.builder()
    .put("discovery.seed_hosts", "host1:9300,host2:9300")
    .put("cluster.name", "my_cluster_name")
    .build();
TransportClient client = new PreBuiltTransportClient(settings);

以上代码使用Settings对象启用了节点发现功能,并将节点列表设置为host1和host2。

负载均衡


负载均衡是在分布式系统中非常重要的一部分,它可以确保系统中所有节点都平均地承载负载。以下是使用Java API添加负载均衡功能的代码示例:

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http"))
                .setHttpClientConfigCallback(httpClientBuilder -> 
                    httpClientBuilder.addInterceptorLast(new ElasticsearchInterceptor())));

以上代码使用RestClient对象添加了一个名为ElasticsearchInterceptor的拦截器来实现负载均衡。

故障转移

故障转移是在Elasticsearch集群中必须考虑的问题。当某个节点发生故障时,需要立即采取行动将其替换为另一个节点。以下是使用Java API添加自动故障转移功能的代码示例:

Settings settings = Settings.builder()
    .put("cluster.routing.allocation.enable", "all")
    .put("cluster.routing.allocation.node_initial_primaries_recoveries", 20)
    .put("cluster.routing.allocation.node_concurrent_recoveries", 2)
    .put("indices.recovery.max_bytes_per_sec", "50mb")
    .build();

以上代码启用了自动故障转移功能,并设置了一些相关参数,例如索引恢复速度和并发恢复数等。

结论

本文介绍了如何进行节点发现、负载均衡和故障转移等操作来配置和管理Elasticsearch集群。这些技术可以使Elasticsearch应用程序更稳定、可靠和高效。在实际应用中,需要选择合适的配置选项和管理方案来满足具体需求。


安全性和访问控制

保护Elasticsearch集群和数据是任何生产环境下应用程序的必要条件之一。本文将介绍如何使用访问控制、加密和身份验证等技术来提高Elasticsearch的安全性。


访问控制

访问控制是Elasticsearch中一个非常重要的概念,它可以确保只有经过授权的用户才能够访问Elasticsearch集群和数据。以下是使用Java API添加基于用户名/密码的访问控制的代码示例:

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http"))
                .setHttpClientConfigCallback(httpClientBuilder -> 
                    httpClientBuilder.setDefaultCredentialsProvider(
                        new BasicCredentialsProvider()))
                .setRequestConfigCallback(requestConfigBuilder -> 
                    requestConfigBuilder.setConnectTimeout(5000)
                                         .setSocketTimeout(60000)));


以上代码使用RestClient对象添加了一个BasicCredentialsProvider对象作为默认凭据提供者,以实现基于用户名/密码的访问控制。

加密

加密可以确保在Elasticsearch集群和数据传输过程中的安全性。以下是使用Java API启用HTTPS加密的代码示例:

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "https")));

以上代码使用RestClient对象启用了HTTPS加密协议,以确保数据传输的安全性。

身份验证

身份验证是Elasticsearch中一个非常重要的概念,它可以确保只有经过授权的用户才能够访问和修改Elasticsearch集群和数据。以下是使用Java API添加基于X-Pack的身份验证功能的代码示例:

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "https"))
                .setHttpClientConfigCallback(httpClientBuilder -> 
                    httpClientBuilder.setDefaultCredentialsProvider(
                        new BasicCredentialsProvider()))
                .setRequestConfigCallback(requestConfigBuilder -> 
                    requestConfigBuilder.setConnectTimeout(5000)
                                         .setSocketTimeout(60000))
                .setXpackBuilder(XPackClientBuilder.builder("username", "password")));


以上代码使用RestClient对象启用了基于X-Pack的身份验证功能,并将用户名和密码设置为"username"和"password"。

结论

本文介绍了如何使用访问控制、加密和身份验证等技术来提高Elasticsearch的安全性。这些技术可以确保Elasticsearch集群和数据的安全性,并保护其免受未经授权的访问和攻击。在实际应用中,需要根据具体需求来选择合适的安全措施。


应用程序集成

将Elasticsearch集成到应用程序中是实现数据搜索和分析的关键。本文将介绍如何使用REST API和各种客户端库来将Elasticsearch集成到应用程序中。


REST API

Elasticsearch提供了REST API,以便应用程序可以通过HTTP协议与Elasticsearch进行交互。以下是使用Java代码向Elasticsearch索引添加文档的示例:

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http")));
IndexRequest request = new IndexRequest("my_index");
request.id("1");
String jsonString = "{" +
        "\"name\":\"John\"," +
        "\"age\":30," +
        "\"city\":\"New York\"" +
        "}";
request.source(jsonString, XContentType.JSON);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);

以上代码使用RestHighLevelClient对象向名为"my_index"的索引添加ID为1的文档。

客户端库

Elasticsearch也提供了各种语言的客户端库,以便应用程序可以更容易地与Elasticsearch交互。以下是使用Java API添加Elasticsearch客户端库的代码示例:

<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
  <version>7.14.0</version>
</dependency>

以上代码将elasticsearch-rest-high-level-client客户端库添加到Java项目中。

以下是使用Java代码向Elasticsearch索引添加文档的客户端库示例:

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http")));
IndexRequest request = new IndexRequest("my_index");
request.id("1");
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("name", "John");
jsonMap.put("age", 30);
jsonMap.put("city", "New York");
request.source(jsonMap);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);


以上代码使用RestHighLevelClient对象和Elasticsearch客户端库向名为"my_index"的索引添加ID为1的文档。

结论


本文介绍了如何使用REST API和各种语言的客户端库将Elasticsearch集成到应用程序中。这些方法可以使应用程序更有效地与Elasticsearch交互,并实现数据搜索和分析等功能。在实际应用中,需要根据具体需求来选择合适的集成方式。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
存储 SQL 监控
|
2月前
|
存储 缓存 监控
深入解析:Elasticsearch集群性能调优策略与最佳实践
【10月更文挑战第8天】Elasticsearch 是一个分布式的、基于 RESTful 风格的搜索和数据分析引擎,它能够快速地存储、搜索和分析大量数据。随着企业对实时数据处理需求的增长,Elasticsearch 被广泛应用于日志分析、全文搜索、安全信息和事件管理(SIEM)等领域。然而,为了确保 Elasticsearch 集群能够高效运行并满足业务需求,需要进行一系列的性能调优工作。
156 3
|
2月前
|
SQL 分布式计算 大数据
大数据-168 Elasticsearch 单机云服务器部署运行 详细流程
大数据-168 Elasticsearch 单机云服务器部署运行 详细流程
64 2
|
5月前
|
存储 人工智能 自然语言处理
阿里云Elasticsearch AI场景语义搜索最佳实践
本文介绍了如何使用阿里云Elasticsearch结合搜索开发工作台搭建AI语义搜索。
17314 68
|
3月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
3月前
|
存储 自然语言处理 关系型数据库
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
聚合、补全、RabbitMQ消息同步、集群、脑裂问题、集群分布式存储、黑马旅游实现过滤和搜索补全功能
ElasticSearch基础3——聚合、补全、集群。黑马旅游检索高亮+自定义分词器+自动补全+前后端消息同步
|
4月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
153 1
|
4月前
|
Kubernetes 容器 Perl
k8s 部署 elasticsearch 单节点
k8s 部署 elasticsearch 单节点
|
4月前
|
机器学习/深度学习 数据采集 缓存
Elasticsearch与机器学习集成的最佳实践
【8月更文第28天】Elasticsearch 提供了强大的搜索和分析能力,而机器学习则能够通过识别模式和预测趋势来增强这些能力。将两者结合可以实现更智能的搜索体验、异常检测等功能。
126 0
|
4月前
|
JSON 测试技术 API
黑马商城 Elasticsearch从入门到部署 RestClient操作文档
这篇文章详细介绍了如何使用Java的RestHighLevelClient客户端与Elasticsearch进行文档操作,包括新增、查询、删除、修改文档以及批量导入文档的方法,并提供了相应的代码示例和操作步骤。