此查询正常工作:
{
"query": {
"bool": {
"must":{
"multi_match":{
"query": "ny gammal",
"fields": ["title", "description^1.4"],
"type": "cross_fields"
}
},
"must_not":{
"range": {
"modelYear":{"gte": 2014}
}
}
}
}
}
它会返回modelYear
小于2014的所有对象。假设我想在2010年到2013年之间获得modelYear
的所有对象。我会这样做:
{
"query": {
"bool": {
"must":{
"multi_match":{
"query": "ny gammal",
"fields": ["title", "description^1.4"],
"type": "cross_fields"
}
},
"must_not":{
"range": {
"modelYear":{"gte": 2014, "lt":2010}
}
}
}
}
}
令我惊讶的是,查询返回与此查询相同的结果:
{
"query": {
"bool": {
"must":{
"multi_match":{
"query": "ny gammal",
"fields": ["title", "description^1.4"],
"type": "cross_fields"
}
}
}
}
}
与没有must_not
子句的查询结果相同。
据我所知,我没有做错任何事。这是一个错误吗?如何使第二个查询起作用?
我正在使用Elasticsearch 6。
答案 0 :(得分:0)
更直观(可读)的方法是
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "ny gammal",
"fields": [
"title",
"description^1.4"
],
"type": "cross_fields"
}
},
{
"range": {
"modelYear": {
"gte": 2010,
"lte": 2013
}
}
}
]
}
}
}
现在,就您的解决方案而言,这取决于您的数据。 提供一个最小的测试样本,展示您的查询不起作用。 提供一些样本数据并进行映射(省略不相关的字段)。
答案 1 :(得分:0)
我可以确认原始观察结果。样本测试数据为
curl -X PUT http://localhost:9200/rqs-mustnot/Car/1234 -d '{"modelYear":2002, "title":"ny gammal 1", "description":"ny gammal 2002"}'
curl -X PUT http://localhost:9200/rqs-mustnot/Car/2345 -d '{"modelYear":2012, "title":"ny gammal 2", "description":"ny gammal 2012"}'
curl -X PUT http://localhost:9200/rqs-mustnot/Car/3456 -d '{"modelYear":2018, "title":"ny gammal 3", "description":"ny gammal 2018"}'
我认为问题在于"modelYear":{"gte": 2014, "lt":2010}
range子句:
这始终是错误的。日期不能同时大于2014年和小于2010年。
must_not
的错误值始终为true。并且must
数组中始终为true的子句与省略它相同。