zoukankan      html  css  js  c++  java
  • spring-data-elasticsearch使用笔记

    使用spring-data遇到了一些问题,记录一下。

    spring-data-elasticsearch版本选择

    这里有一份官方github上的spring-data-elasticsearch与elasticsearch的对应关系表,但是不太完整,但是还是比较有参考价值的

    spring data elasticsearch elasticsearch
    3.0.0.RC2 5.5.0
    3.0.0.M4 5.4.0
    2.0.4.RELEASE 2.4.0
    2.0.0.RELEASE 2.2.0
    1.4.0.M1 1.7.3
    1.3.0.RELEASE 1.5.2
    1.2.0.RELEASE 1.4.4
    1.1.0.RELEASE 1.3.2
    1.0.0.RELEASE 1.1.1

    elasticsearch的客户端版本必须与服务端版本主版本保持一致。

    参考:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/client.html

    The client must have the same major version (e.g. 2.x, or 5.x) as the nodes in the cluster. Clients may connect to clusters which have a different minor version (e.g. 2.3.x) but it is possible that new functionality may not be supported. Ideally, the client should have the same version as the cluster.

    由于公司使用的elasticsearch 2.1.1,所以选择了spring-data-elasticsearch 2.1.7.RELEASE(2.1.7对应的原生客户端版本是elasticsearch 2.4.0,上面表格可能不完整)。

    遇到异常java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation

    原因是项目使用的springframework版本为4.1.6,而spring-data-elasticsearch 2.1.7默认依赖的spring-context是4.3.11,所以初步确定是我们的项目使用的spring版本太低导致。

    参考spring的api文档,发现原来AnnotatedElementUtils.findMergedAnnotation是4.2版才有的(since 4.2)。

    @Field日期类型

        @Field(type = FieldType.Date,
                index = FieldIndex.not_analyzed,
                format = DateFormat.custom,
                pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        private Date createTime;
    

    参考stackoverflow

    @Document中动态indexName

    配置Bean

    @Component("esConfig")
    public class ESConfig {
    
        @Value("${app.env}")
        private String env;
    
        public String getEnv() {
            return env;
        }
    
        public void setEnv(String env) {
            this.env = env;
        }
    }
    

    @Document注解

    @Document(indexName = "index-#{esConfig.env}", type = "typename", shards = 4, replicas = 1)
    

    参考1
    参考2

    安装ik插件

    1. 从官网下载es版本对应版本的ik插件,https://github.com/medcl/elasticsearch-analysis-ik

    2. 我开发环境安装的es是2.4.1,一开始放在了D:Program Files下,结果加入ik插件后就启动不了了,原来是不支持带空格的路径,换了路径就好了。(参考

    3. 测试

      链接:http://localhost:9200/_analyze?analyzer=stardard&pretty=true&text=今天天气真好

      {
        "tokens" : [ {
          "token" : "今",
          "start_offset" : 0,
          "end_offset" : 1,
          "type" : "<IDEOGRAPHIC>",
          "position" : 0
        }, {
          "token" : "天",
          "start_offset" : 1,
          "end_offset" : 2,
          "type" : "<IDEOGRAPHIC>",
          "position" : 1
        }, {
          "token" : "天",
          "start_offset" : 2,
          "end_offset" : 3,
          "type" : "<IDEOGRAPHIC>",
          "position" : 2
        }, {
          "token" : "气",
          "start_offset" : 3,
          "end_offset" : 4,
          "type" : "<IDEOGRAPHIC>",
          "position" : 3
        }, {
          "token" : "真",
          "start_offset" : 4,
          "end_offset" : 5,
          "type" : "<IDEOGRAPHIC>",
          "position" : 4
        }, {
          "token" : "好",
          "start_offset" : 5,
          "end_offset" : 6,
          "type" : "<IDEOGRAPHIC>",
          "position" : 5
        } ]
      }
      

      链接:http://localhost:9200/_analyze?analyzer=ik&pretty=true&text=今天天气真好

      {
        "tokens" : [ {
          "token" : "今天天气",
          "start_offset" : 0,
          "end_offset" : 4,
          "type" : "CN_WORD",
          "position" : 0
        }, {
          "token" : "今天",
          "start_offset" : 0,
          "end_offset" : 2,
          "type" : "CN_WORD",
          "position" : 1
        }, {
          "token" : "天天",
          "start_offset" : 1,
          "end_offset" : 3,
          "type" : "CN_WORD",
          "position" : 2
        }, {
          "token" : "天气",
          "start_offset" : 2,
          "end_offset" : 4,
          "type" : "CN_WORD",
          "position" : 3
        }, {
          "token" : "真好",
          "start_offset" : 4,
          "end_offset" : 6,
          "type" : "CN_WORD",
          "position" : 4
        } ]
      }
      

    head插件安装和使用

    1. 参考

    elasticsearch client api

    1. 通过Query删除

    or and

    sql: select * from table where active=1 and ( name like '%?%' or code like '%?%' )
    elasticsearch 用java client怎么写呢?
    --------------------------------------
    QueryBuilder qb = QueryBuilders.boolQuery()
    .must(new QueryStringQueryBuilder("1").field("active"))
    .must(QueryBuilders.boolQuery()
        .should(QueryBuilders.matchQuery("name", "小李子"))
        .should(QueryBuilders.matchQuery("code", 小李子"))
    );
    

    in

    sql: select * from table where name in ('tom', 'john');
    QueryBuilder qb = QueryBuilders.boolQuery()
    List<String> list = new ArrayList<String>();
    list.add("tom");
    list.add("john");
    BoolQueryBuilder in = QueryBuilders.boolQuery();
    for(String name : list) {
       in.shoud(QueryBuilders.matchPhraseQuery("name", name));
    }
    qb.must(in);
    

    打印dsl日志

            NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder()
                    .withQuery(boolQueryBuilder);
            builder.withPageable(new PageRequest(param.getPageNo(), 20))
                    .withSort(new FieldSortBuilder("updateTime").order(SortOrder.DESC));
            SearchQuery searchQuery = builder.build();
            logger.info("QueryDSL:
    {}", searchQuery.getQuery().toString());
    

    参考

  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/liqipeng/p/7657854.html
Copyright © 2011-2022 走看看