美文网首页
ElasticSearch快速开始

ElasticSearch快速开始

作者: 扮鬼之梦 | 来源:发表于2020-06-02 14:43 被阅读0次

    文档地址

    faster框架ES配置文档

    https://framework.faster.org.cn/#/advanced/Elasticsearch/quickstart

    faster框架ES版本选择

    因为faster使用的SpringBoot版本为2.1.5,所以ES客户端需要安装6.1.1。
    使用最新版的SpringBoot的话,可以使用ES版本为7.7.0的。

    SpringBoot项目ElasticSearch配置

    根据ES版本和SpringBoot版本查询官方文档即可。

    常用命令

    1.删除索引

    用以下的请求来 删除索引:

    DELETE /my_index
    

    你也可以这样删除多个索引:

    DELETE /index_one,index_two
    DELETE /index_*
    

    你甚至可以这样删除 全部 索引:

    DELETE /_all
    DELETE /*
    

    2.获取设置_settings信息

    GET _settings
    

    3.设置max_result_window

    PUT _settings
    {
      "index": {
        "max_result_window": "10000000"
      }
    }
    

    ElasticsearchRepository操作ES

    新建实体

    import lombok.Data;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.elasticsearch.annotations.Document;
    import org.springframework.data.elasticsearch.annotations.Field;
    import org.springframework.data.elasticsearch.annotations.FieldType;
    
    @Document(indexName = "sim_info", type = "sim_info")
    @Data
    public class CardInfo {
        @Id
        private Long id;
    
        @Field(type = FieldType.Keyword)
        private String msisdn;
    
        @Field(type = FieldType.Keyword)
        private String iccid;
    
        @Field(type = FieldType.Keyword)
        private String imsi;
    
        @Field(type = FieldType.Long)
        private Long customerId;
    
        @Field(type = FieldType.Integer)
        private Integer telecomOperator;
    
        @Field(type = FieldType.Keyword)
        private String outStoreDate;
    
        @Field(type = FieldType.Boolean)
        private Boolean supportSms;
    
        @Field(type = FieldType.Double)
        private Double totalDataAmount;
    
    }
    

    新建Repository

    import com.whty.esim.model.document.CardInfo;
    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
    
    //<CardInfo, Long> CardInfo为实体类,Long为主键数据类型
    public interface SimInfoRepository extends ElasticsearchRepository<CardInfo, Long> { }
    

    注入Repository

    @Autowired
    private SimInfoRepository simInfoRepository;
    

    导入数据

    simInfoRepository.saveAll(list);
    

    各类查询参考文档

    https://blog.csdn.net/HiBoyljw/article/details/89951019

    分页查询

    //页码从0开始,每页任意条
    PageRequest of = PageRequest.of(0, 10);
    Page<CardInfoRes> page = null;
    try {
         //分页并带查询条件
         //BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
         //boolQueryBuilder.must(QueryBuilders.wildcardQuery("msisdn","*11111*"));
         //page =simInfoRepository.search(boolQueryBuilder,of);
    
         page =simInfoRepository.findAll(of);
    }catch (Exception e){
         throw new BusinessException("查询失败");
    }
    
    

    当pageIndex*pageSize大于10000时,会抛以下异常

    org.elasticsearch.action.search.SearchPhaseExecutionException: all shards failed
    

    需在ES客户端设置max_result_window

    PUT _settings
    {
      "index": {
        "max_result_window": "10000000"
      }
    }
    

    组合查询

    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    //AND
    boolQueryBuilder.must(QueryBuilder);   
    //NOT
    boolQueryBuilder.mustNot(QueryBuilder); 
    //OR
    boolQueryBuilder.should(QueryBuilder); 
    

    精确查询

    //完全匹配
    QueryBuilders.termQuery("key", obj);
    //一次匹配多个值
    QueryBuilders.termsQuery("key", obj1, obj2..);   
    //单个匹配, field不支持通配符, 前缀具高级特性
    QueryBuilders.matchQuery("key", Obj); 
    //匹配多个字段
    QueryBuilders.multiMatchQuery("text", "field1", "field2"..);  
    

    通配符查询,模糊查询

    QueryBuilders.wildcardQuery("msisdn","*11111*")
    

    前缀查询

    QueryBuilders.prefixQuery("msisdn","111111")
    

    Count查询

    PageRequest of = PageRequest.of(0, 1);
    //boolQueryBuilder为查询条件
    long count = simInfoRepository.search(boolQueryBuilder, of).getTotalElements();
    

    范围查询

    //方法一
    QueryBuilders.rangeQuery("offeringEndDate")
                        .from("2020-01-05",true).to("2020-01-05",true);
    //方法二
    QueryBuilders.rangeQuery("offeringEndDate")
                        .gte("2020-01-03").lte("2020-01-05");
    

    ElasticsearchTemplate操作ES

    注入ElasticsearchTemplate

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;
    

    删除索引

    boolean flag = elasticsearchTemplate.deleteIndex("sim_info");
    

    判断索引是否存在

    boolean flag = elasticsearchTemplate.indexExists("sim_info")
    

    获取索引Setting

    Map settingMap = elasticsearchTemplate.getSetting("sim_info");
    

    设置索引Setting

    UpdateSettingsResponse indexResponse = elasticsearchTemplate.getClient()
        .admin().indices().prepareUpdateSettings("sim_info")
            .setSettings(
            Settings.builder()
                    .put("index.max_result_window", 10000000)
                    .build()
            ).get();
    indexResponse.isAcknowledged();
    

    相关文章

      网友评论

          本文标题:ElasticSearch快速开始

          本文链接:https://www.haomeiwen.com/subject/ejpuzhtx.html