elasticsearch知识库

crud

// 新增文档
RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http")));
IndexRequest request = new IndexRequest("index");
request.id("1"); // 指定文档id
String jsonString = "{" +
        "\"name\":\"John\"," +
        "\"age\":30," +
        "\"city\":\"New York\"" +
        "}";
request.source(jsonString, XContentType.JSON);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println(response);
client.close();

// 获取文档
RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http")));
GetRequest getRequest = new GetRequest("index", "1");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
String sourceAsString = getResponse.getSourceAsString();
System.out.println(sourceAsString);
client.close();

// 更新文档
RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http")));
UpdateRequest request = new UpdateRequest("index", "1");
String jsonString = "{" +
        "\"name\":\"John Doe\"," +
        "\"age\":35," +
        "\"city\":\"Los Angeles\"" +
        "}";
request.doc(jsonString, XContentType.JSON);
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println(response);
client.close();

// 删除文档
RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http")));
DeleteRequest request = new DeleteRequest("index", "1");
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
System.out.println(response);
client.close();

es查询缓存

es查询缓存

索引路由

Elasticsearch的路由(Routing)特性
在Elasticsearch中,一个索引被分为多个分片,每个分片包含了部分索引数据。当我们进行查询时,Elasticsearch会将查询请求发送到每个分片上执行查询操作,然后将结果合并返回给客户端。
而路由查询是一种特殊的查询方式,它允许我们在查询时指定一个路由键来确定查询应该在哪个分片上执行。这样,查询就只会在该路由键所对应的分片上执行,从而避免了在所有分片上执行查询的开销。
举个例子,假设我们有一个名为“my_index”的索引,它被分为3个分片,每个分片的路由键分别为0、1、2。我们想要查询该索引中“title”字段包含“elasticsearch”关键字的文档,这时我们可以使用路由查询来提高查询效率。
如果我们不使用路由查询,查询请求会被发送到所有3个分片上,每个分片都会执行查询操作,并将结果返回给客户端。这样就会产生大量的网络和计算开销。
而如果我们使用路由查询,我们可以在查询时指定一个路由键,如“1”,这样查询请求就只会被发送到路由键为1的分片上执行查询操作,其他分片则不会参与查询。这样就可以减少查询的开销,提高查询效率。

路由查询
路由查询是指在查询时指定特定的路由键,使得查询只在指定路由键所在的分片上执行。这种查询方式可以提高查询的效率,特别是在分布式环境下,因为查询只会在一个分片上执行,避免了在所有分片上执行查询的开销。
使用路由查询需要在查询时指定路由键,例如:

// 设置routing,加速搜索,一般使用用户id类似的字段填充
//	indexRequest.routing(String.valueOf(i));

GET /my_index/my_type/_search?routing=key_value
{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  }
}

无路由查询
无路由查询是指在查询时不指定路由键,查询会在所有分片上执行。这种查询方式适用于单个分片的数据量不大的情况下,因为查询会在所有分片上执行,可能会增加查询的开销。
使用无路由查询不需要指定路由键,例如:

GET /my_index/my_type/_search
{
  "query": {
    "match": {
      "title": "elasticsearch"
    }
  }
}

索引ID

Elasticsearch中的每个文档都有一个唯一的ID,这个ID是由Elasticsearch自动生成的,也可以手动指定。Elasticsearch的索引ID有以下作用:

唯一标识文档
文档的ID是文档在索引中的唯一标识符,它可以用于对文档进行查找、更新、删除等操作。如果文档没有指定ID,则Elasticsearch会自动生成一个唯一的ID。

索引性能优化
Elasticsearch通过ID来分配文档到不同的分片中,并且在分片之间分配副本。如果文档ID是随机生成的,则导致文档分布不均匀,从而导致性能下降。因此,最好为文档指定一个有序的ID,如时间戳或自增数字等,这样可以让文档分布更均匀,提高索引的性能。

避免重复插入
Elasticsearch需要文档ID来避免在插入文档时重复插入。如果插入的文档ID已经存在,则Elasticsearch会将新文档覆盖已有文档,而不是插入新文档。因此,为文档指定一个唯一的ID可以避免重复插入。
总之,索引ID在Elasticsearch中有着非常重要的作用,它不仅仅是文档的唯一标识符,还可以对索引性能进行优化,并且可以避免文档的重复插入。因此,在实际使用中,我们应该根据具体需求来选择是否手动指定文档ID。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值