假设我对2010年至2019年发行的所有电影都有索引; 如何在SQL中将此查询转换为ElasticSearch?
Select *
From movies
Where
releaseDate between '2018-01-01' and '2019-01-01' and
gender is like 'action' and
(mainActorId = 42 or mainActorId is null)
我想要2018年以来所有具有特定主要演员或根本没有主要演员的动作电影。如何将其转换为ElasticSearch查询?
根据我到目前为止在文档中所读的内容,我可以使用类似以下的内容:
{
"size":0,
"query":{
"bool":{
"must":[
{
"range":{
"releaseDate":{
"from":"2018-01-01T00:00:01.531Z",
"to":"2019-01-01T00:00:01.531Z",
"include_lower":true,
"include_upper":true,
"boost":1.0
}
}
},
{
"terms":{
"gender":[
"action"
],
"boost":1.0
}
},
{
"terms":{
"mainActorId":[
42,
56
],
"boost":1.0
}
}
],
"must_not":[
{
"exists":{
"field":"mainActorId",
"boost":1.0
}
}
],
"adjust_pure_negative":true,
"boost":1.0
}
}
}
但这并没有给我带来任何成功,即使在2018年发行的动作片中,我想要的主要演员(或者根本没有主要演员)。如果我删除了“ must_not exist”子句,该查询将正常工作,并为我提供想要的主要演员的动作片,但我也希望没有主要演员的动作片...
答案 0 :(得分:2)
到目前为止很好的开始!!您快到了,请参阅下面的查询,它应该可以完成您所期望的操作:
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"range": {
"releaseDate": {
"from": "2018-01-01T00:00:01.531Z",
"to": "2019-01-01T00:00:01.531Z",
"include_lower": true,
"include_upper": true,
"boost": 1
}
}
},
{
"terms": {
"gender": [
"action"
],
"boost": 1
}
}
],
"should": [
{
"bool": {
"must_not": [
{
"exists": {
"field": "mainActorId"
}
}
]
}
},
{
"terms": {
"mainActorId": [
42,
56
]
}
}
],
"minimum_should_match": 1,
"adjust_pure_negative": true,
"boost": 1
}
}
}