使用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:\n{}", searchQuery.getQuery().toString());

参考

最新文章

  1. 验证ASP.NET页生命周期时间的触发顺序
  2. C++读写文件ofstream,ifstream,fstream)[转]
  3. C#生成随机验证码
  4. PHP 日期比较
  5. Java [Leetcode 328]Odd Even Linked List
  6. PC问题-可以PING通IP,PING名字不通,可以远程,但不能访问共享文件夹?
  7. BZOJ 1507 [NOI2003]Editor
  8. BZOJ 3343教主的魔法
  9. 自适应SimpsonSimpson积分
  10. php新建数据库对象 基础知识
  11. js存款计算器原生小demo
  12. 听翁恺老师mooc笔记(14)--格式化的输入与输出
  13. linux系统ansible一键完成三大服务器基本配置
  14. 用递归方法判断字符串是否是回文(Recursion Palindrome Python)
  15. mysql使其支持插入中文数据的办法
  16. EOF多行写入文件防止变量替换
  17. react-router 4.3 js实现跳转
  18. Scrapy 爬取BOSS直聘关于Python招聘岗位
  19. 进制转换(NOIP2000&NOIP水题测试(2017082301))
  20. iOS分辨率的那些事儿(转)

热门文章

  1. 尝鲜.net core2.1 ——编写一个global tool
  2. android library使用方法
  3. .Net Core .Net Core V1.0 创建MVC项目
  4. linux 虚拟机 安装 php-7.0.2
  5. fputs()
  6. 移动端复制粘贴clipboardjs
  7. 【Es】jest操作elasticsearch
  8. python参数传递:对象的引用
  9. P3615 如厕计划
  10. 关于执行webdriver.Chrome; 报错WebDriverException: Message: unknown error: Element is not clickable at point (1085, 103)