需求
- 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
}
}
}