当前位置:   article > 正文

java es相关操作

java es相关操作

一.es 后期修改分片数量

Elasticsearch中一旦索引创建后,分片的数量就不能直接更改。如果需要更改分片的数量,你需要按照以下步骤操作:

  1. 创建一个新的索引,并指定所需的分片数量。

  2. 将旧索引的数据复制到新索引中。

  3. 关闭旧索引,并将新索引设置为激活状态。

    1. <dependencies>
    2. <!-- 添加Elasticsearch客户端依赖 -->
    3. <dependency>
    4. <groupId>org.elasticsearch.client</groupId>
    5. <artifactId>elasticsearch-rest-high-level-client</artifactId>
    6. <version>7.10.2</version> <!-- 请根据需要替换为合适的版本号 -->
    7. </dependency>
    8. <!-- 其他依赖... -->
    9. </dependencies>

    1. import org.elasticsearch.client.RequestOptions;
    2. import org.elasticsearch.client.RestHighLevelClient;
    3. import org.elasticsearch.client.indices.CreateIndexRequest;
    4. import org.elasticsearch.client.indices.CreateIndexResponse;
    5. import org.elasticsearch.client.indices.GetIndexRequest;
    6. import org.elasticsearch.client.indices.UpdateAliasesRequest;
    7. import org.elasticsearch.client.indices.UpdateIndexSettingsRequest;
    8. import org.elasticsearch.common.settings.Settings;
    9. import org.elasticsearch.common.xcontent.XContentType;
    10. public class ChangeShardsExample {
    11. public static void main(String[] args) throws IOException {
    12. // 初始化Elasticsearch客户端
    13. try (RestHighLevelClient client = new RestHighLevelClient(...)) {
    14. // 创建新索引
    15. String newIndex = "new_index";
    16. CreateIndexRequest createIndexRequest = new CreateIndexRequest(newIndex);
    17. createIndexRequest.settings(Settings.builder()
    18. .put("index.number_of_shards", 5) // 设置新的分片数量
    19. .put("index.number_of_replicas", 1));
    20. CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
    21. if (createIndexResponse.isAcknowledged()) {
    22. System.out.println("新索引创建成功");
    23. // 复制旧索引数据到新索引
    24. // ...
    25. // 关闭旧索引
    26. String oldIndex = "old_index";
    27. client.indices().close(new CloseIndexRequest(oldIndex), RequestOptions.DEFAULT);
    28. // 更新别名,使新索引可用
    29. AliasActions aliasAction = new AliasActions(AliasActions.Type.ADD)
    30. .index(newIndex)
    31. .alias(oldIndex);
    32. UpdateAliasesRequest aliasRequest = new UpdateAliasesRequest()
    33. .actions(aliasAction);
    34. client.indices().updateAliases(aliasRequest, RequestOptions.DEFAULT);
    35. System.out.println("旧索引已关闭,新索引设置为可用");
    36. }
    37. }
    38. }
    39. }

    es的分片数量的计算规则是最好保证每个分片的的数据在20G左右,根据实际情况测试

二。 es  查询 and  or  等

es是使用DSL语句进行查询的,java提供了相关api,生成最终的DSL语句,下面代码中的boolQueryBuilder对象中就有最终的DSL语句。

  1. import org.elasticsearch.client.RequestOptions;
  2. import org.elasticsearch.client.RestHighLevelClient;
  3. import org.elasticsearch.index.query.QueryBuilders;
  4. import org.elasticsearch.index.query.BoolQueryBuilder;
  5. import org.elasticsearch.search.builder.SearchSourceBuilder;
  6. import org.elasticsearch.action.search.SearchRequest;
  7. import org.elasticsearch.action.search.SearchResponse;
  8. import org.elasticsearch.search.SearchHit;
  9. // 假设你已经有了一个RestHighLevelClient实例client
  10. RestHighLevelClient client;
  11. // 创建一个BoolQueryBuilder来构建ANDOR查询
  12. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  13. // 添加AND查询条件
  14. boolQueryBuilder.must(QueryBuilders.matchQuery("field1", "value1"));
  15. boolQueryBuilder.must(QueryBuilders.matchQuery("field2", "value2"));
  16. // 添加OR查询条件
  17. boolQueryBuilder.should(QueryBuilders.matchQuery("field3", "value3"));
  18. boolQueryBuilder.should(QueryBuilders.matchQuery("field4", "value4"));
  19. // 设置查询的索引
  20. String index = "your_index";
  21. // 创建一个搜索请求
  22. SearchRequest searchRequest = new SearchRequest(index);
  23. // 创建搜索源构建器
  24. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  25. searchSourceBuilder.query(boolQueryBuilder);
  26. // 设置搜索源
  27. searchRequest.source(searchSourceBuilder);
  28. try {
  29. // 执行搜索
  30. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  31. // 处理搜索结果
  32. for (SearchHit hit : searchResponse.getHits().getHits()) {
  33. System.out.println(hit.getSourceAsString());
  34. }
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }

三. es 根据字段排序

  1. import org.elasticsearch.client.RestHighLevelClient;
  2. import org.elasticsearch.index.query.QueryBuilders;
  3. import org.elasticsearch.search.builder.SearchSourceBuilder;
  4. import org.elasticsearch.action.search.SearchRequest;
  5. import org.elasticsearch.action.search.SearchResponse;
  6. import org.elasticsearch.search.sort.SortOrder;
  7. import org.elasticsearch.search.sort.FieldSortBuilder;
  8. import java.io.IOException;
  9. public class ElasticsearchSortExample {
  10. public static void main(String[] args) throws IOException {
  11. // 初始化Elasticsearch客户端(这里需要根据实际情况进行配置)
  12. RestHighLevelClient client = new RestHighLevelClient(...);
  13. // 创建搜索请求并设置索引名
  14. SearchRequest searchRequest = new SearchRequest("your_index");
  15. // 构建搜索源构建器
  16. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  17. // 设置查询条件(这里以匹配所有为例)
  18. searchSourceBuilder.query(QueryBuilders.matchAllQuery());
  19. // 添加排序
  20. searchSourceBuilder.sort(new FieldSortBuilder("your_sort_field").order(SortOrder.ASC)); // 根据字段升序排序
  21. // 将搜索源构建器设置到搜索请求中
  22. searchRequest.source(searchSourceBuilder);
  23. // 执行搜索
  24. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  25. // 处理搜索结果(这里仅打印命中数量)
  26. System.out.println("Total hits: " + searchResponse.getHits().getTotalHits().value);
  27. // 关闭客户端
  28. client.close();
  29. }
  30. }

四.es评分修改(评分是搜索的结果排序依据是es中一个重要的点)

在Elasticsearch中,评分是一个复杂的过程,它涉及到文档与查询的匹配程度。评分是基于文档与查询中的某个字段相关性来计算的。在Elasticsearch中,有多种方法来影响评分过程,例如:

  1. 使用不同的相关性模型,如TF-IDF,BM25等。

  2. 使用函数查询,调整字段的权重。

  3. 使用索引时的设置,如分析器,提高某些字段的重要性。

评分的计算过程如下:

  1. 计算查询与文档的匹配程度。

  2. 计算每个字段的评分。

  3. 将字段的评分累加到文档级别的评分中。

  4. 对所有文档进行排序,评分高的排在前面。

以下是一个简单的Java代码示例

  1. import org.elasticsearch.client.RestHighLevelClient;
  2. import org.elasticsearch.index.query.QueryBuilders;
  3. import org.elasticsearch.search.aggregations.AggregationBuilders;
  4. import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
  5. import org.elasticsearch.action.search.SearchRequest;
  6. import org.elasticsearch.action.search.SearchResponse;
  7. import org.elasticsearch.search.builder.SearchSourceBuilder;
  8. import org.elasticsearch.search.aggregations.AggregationBuilders;
  9. import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;
  10. import org.elasticsearch.search.aggregations.metrics.ValueCountAggregationBuilder;
  11. import org.elasticsearch.search.aggregations.pipeline.PipelineAggregatorBuilders;
  12. import org.elasticsearch.search.aggregations.pipeline.BucketSelectorPipelineAggregationBuilder;
  13. // 假设你已经有了一个RestHighLevelClient实例client
  14. SearchRequest searchRequest = new SearchRequest("index_name"); // 替换为你的索引名
  15. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  16. searchSourceBuilder.query(QueryBuilders.matchAllQuery());
  17. // 添加一个计分函数,比如使用一个辅导聚合
  18. searchSourceBuilder.functionScore()
  19. .scoreMode("sum") // 可以是 "sum", "multiply", "min", "max", "avg"
  20. .setMinScore(1); // 设置最小分数,如果所有函数分数加起来低于这个值,则文档将被丢弃
  21. // 你可以添加多个计分函数,比如使用一个平均聚合
  22. AvgAggregationBuilder avgAggregation = AggregationBuilders.avg("avg_price").field("price");
  23. searchSourceBuilder.functionScore()
  24. .add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(
  25. new QueryBuilders.matchAllQuery()).scoreMode("multiply").setFilter(QueryBuilders.matchQuery("type", "electronics")).setWeight(1.5)))
  26. .add(new FunctionScoreQueryBuilder.FilterFunctionBuilder().scoreFunction(new FunctionScoreQueryBuilder.WeightBuilder().setWeight(2.0)).setFilter(QueryBuilders.matchQuery("type", "books"))));
  27. searchRequest.source(searchSourceBuilder);
  28. SearchResponse searchResponse = client.search(searchRequest);
  29. // 处理搜索响应
  30. // 注意:确保在完成操作后关闭client以释放资源

5.es使用自定义的评分

script_score 是es中用于自定义脚本计算评分,Java也提供了相关api,script_score可以接受参数用于计算,比方说20岁左右的人优先查询

  1. //client 创建代码省略
  2. // 初始化你的Elasticsearch客户端
  3. String indexName = "your_index"; // 你的索引名
  4. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  5. ScriptScoreQueryBuilder scriptScoreQueryBuilder = QueryBuilders.scriptScoreQuery(QueryBuilders.matchAllQuery());
  6. //Script 可以支持从外部传参,参数是一个map,如果需要从客户端传入参数可以这样使用
  7. Script script = new Script("doc['age'].value - 20"); // 假设age是你存储年龄的字段
  8. scriptScoreQueryBuilder.script(script);
  9. searchSourceBuilder.query(scriptScoreQueryBuilder);
  10. searchSourceBuilder.sort("_score"); // 根据得分排序
  11. SearchRequest searchRequest = new SearchRequest(indexName);
  12. searchRequest.source(searchSourceBuilder);
  13. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/631246
推荐阅读
相关标签
  

闽ICP备14008679号