使用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的客户端版本必须与服务端版本主版本保持一致。
参考:
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版本太低导致。
参考,发现原来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;
@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)
安装ik插件
从官网下载es版本对应版本的ik插件,
我开发环境安装的es是2.4.1,一开始放在了D:\Program Files\下,结果加入ik插件后就启动不了了,原来是不支持带空格的路径,换了路径就好了。()
测试
链接:http://localhost:9200/_analyze?analyzer=stardard&pretty=true&text=今天天气真好
{ "tokens" : [ { "token" : "今", "start_offset" : 0, "end_offset" : 1, "type" : "
", "position" : 0 }, { "token" : "天", "start_offset" : 1, "end_offset" : 2, "type" : " ", "position" : 1 }, { "token" : "天", "start_offset" : 2, "end_offset" : 3, "type" : " ", "position" : 2 }, { "token" : "气", "start_offset" : 3, "end_offset" : 4, "type" : " ", "position" : 3 }, { "token" : "真", "start_offset" : 4, "end_offset" : 5, "type" : " ", "position" : 4 }, { "token" : "好", "start_offset" : 5, "end_offset" : 6, "type" : " ", "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插件安装和使用
elasticsearch client api
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()Listlist = new ArrayList ();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());