不得与弹性搜索

时间:2018-09-10 13:47:45

标签: elasticsearch

在弹性搜索模式中,我有4个字段。

date
status
type
createdAt

现在,我需要获取

的所有行
date=today
status = "confirmed" 
and where type is not equals to "def"

但是,如果

可以
type=def exists 

但仅当字段createdAt不等于today时。

我当前的查询如下:

{
    must: [
        { "bool":
            {
                "must": [
                    {"term": {"date": 'now/d'}},
                    {"term": {"status": 'confirmed'}},
                ]
          }
        }
    ],
    mustNot: [
        {"match": {'createdAt': 'now/d'}},
        {"match":{"type": "def"}}
    ]
}

获取类型不等于“ def”的行。 但是,如果一行中有type=def AND createdAT any date but today,则该行不会显示。

我在做什么错?

2 个答案:

答案 0 :(得分:1)

此查询应该有效。

0
0.01
0.05
0.25
0.5
0.75
0.9
0.99
1

我相信您的版本无法正常运行的原因是must_not中的每个查询都不能匹配。 https://www.elastic.co/guide/en/elasticsearch/guide/current/bool-query.html#_controlling_precision

  

所有must子句必须匹配,并且所有must_not子句都不能匹配,但是应该匹配多少个子句?默认情况下,所有的should子句都不需要匹配,只有一个例外:如果没有must子句,则至少必须匹配一个Should子句。

答案 1 :(得分:1)

假设这样的设置:

PUT twitter
{
  "settings": {
    "index": {
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type": "date",
          "format": "epoch_millis"
        },
        "createdAt": {
          "type": "date",
          "format": "epoch_millis"
        },
        "status": {
          "type": "keyword"
        },
        "type": {
          "type": "keyword"
        }
      }
    }
  }
}

和这样的示例文档(调整值以测试查询):

post twitter/_doc/1
{
 "date": 1536562800000, //start of TODAY September 10, 2018 in UTC
 "createdAt": 1536562799999,
 "status": "confirmed",
 "type": "def"
}

以下查询应正常工作:

get twitter/_search
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "date": {
                  "gte": "now/d",
                  "lte": "now/d"
                }
              }
            },
            {
              "term": {
                "status": "confirmed"
              }
            }
          ],
          "must_not": [
            {
              "range": {
                "createdAt": {
                  "gte": "now/d",
                  "lte": "now/d"
                }
              }
            },
            {
              "term": {
                "type": "def"
              }
            }
          ]
        }
      }
    }
  }
}

这是一个经过筛选的查询,对于这种情况我认为更好,因为它不计算分数。如果您确实想计算分数,只需从顶部移除布尔和过滤器即可。