需求
- elasticsearch查询,需要查询某个值organDn为空或为null,或等于某值
- sql实现很简单,elasticsearch没有这种语法
- 需要使用elasticsearch支持的现有语法变通实现
实现
- java代码,elasticsearch官方提供的java api接口实现
- 使用boolQuery()、termQuery()、existsQuery(),利用should方法和mustNot方法
- 如果需要将第一个等于某值,换成模糊匹配,可以使用
QueryBuilders.matchPhraseQuery("organDn",dn);
- java代码如下:
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.should(QueryBuilders.termQuery("organDn.keyword",dn));
boolQuery.should(QueryBuilders.termQuery("organDn",""));
boolQuery.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("organDn")));
{
"_source": false,
"query": {
"bool": {
"adjust_pure_negative": true,
"boost": 1.0,
"disable_coord": false,
"should": [
{
"term": {
"organDn.keyword": {
"value": "o=532d340fb47ed20e08edbc09d0a37b3b,dc=lonsun,dc=cn",
"boost": 1.0
}
}
},
{
"term": {
"organDn": {
"boost": 1.0,
"value": ""
}
}
},
{
"bool": {
"adjust_pure_negative": true,
"boost": 1.0,
"disable_coord": false,
"must_not": [
{
"exists": {
"boost": 1.0,
"field": "organDn"
}
}
]
}
}
]
}
},
"size": 10
}
- 如果等于某值换成模糊匹配
like
某值,搜索结构体,should的第一个条件换成
{
"match_phrase": {
"organDn": {
"boost": 1.0,
"query": "o=532d340fb47ed20e08edbc09d0a37b3b,dc=lonsun,dc=cn",
"slop": 0
}
}
}