Elasticsearch:如何在 Elasticsearch 中搜索空值_elasticsearch 空值查询

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

根据 Elasticsearch 文档无法索引或搜索空值 null。 当一个字段设置为 null或空数组或空值数组时它被视为该字段没有值。

那么如何找到 product_name 为空null的文件呢

选项 1null_value 映射参数

你可以在配置索引映射时定义 null_value 参数。 它将允许你在索引文档时用指定值替换显式空值 null以便它可以被索引和搜索。

让我们创建索引名称 products其中包含值为 NULL 的 product_name 字段。

PUT products
{
  "mappings": {
    "properties": {
      "product_name":{
        "type": "keyword",
        "null_value": "NULL"
      }
    }
  }
}

让我们用 product_name 字段索引一些文档该字段的值为 null 或空数组。

POST products/_doc/1
{
  "product_name": null,
  "company":"apple"
}
POST products/_doc/2
{
  "product_name": [],
  "company":"apple"
}

让我们查询并检查我们得到的结果

POST products/_search
{
  "query": {
    "match": {
      "product_name": "NULL"
    }
  }
}

上面的搜索结果为

{
  "took": 1009,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "products",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "product_name": null,
          "company": "apple"
        }
      }
    ]
  }
}

什么 为什么 Elasticsearch 只返回一个文档而不返回第二个具有空数组的文档 因为

  • 一个空数组不包含明确的 null因此不会被 null_value 替换。

此外product_name 值仅作为 null 而不是作为在索引映射中设置的 NULL。 因为

  • null_value 只影响数据的索引方式它不会修改 _source 文档。

现在当 product_name 为 null 或空数组时如何将两个文档都放入结果中

选项2使用 MUST_NOT 查询

让我们定义没有 null_value 的索引映射和与上面相同的索引文档。

PUT products
{
  "mappings": {
    "properties": {
      "product_name":{
        "type": "keyword"
      }
    }
  }
}

现在你可以使用以下查询

POST products/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "product_name"
          }
        }
      ]
    }
  }
}

上述查询的结果它现在返回两个结果

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 0,
    "hits": [
      {
        "_index": "products",
        "_id": "1",
        "_score": 0,
        "_source": {
          "product_name": null,
          "company": "apple"
        }
      },
      {
        "_index": "products",
        "_id": "2",
        "_score": 0,
        "_source": {
          "product_name": [],
          "company": "apple"
        }
      }
    ]
  }
}

将 must_not 与 exists 查询一起使用的优点

  • 此选项 2 不依赖于字段的数据类型无论字段的数据类型如何它都会起作用但选项 1 null_value 需要与字段的数据类型相同。 例如长字段不能有字符串 null_value。
  • 选项 1 不适用于文本类型的字段因为 Elasticsearch 不允许为文本类型的字段设置 null_value 参数。
  • 选项 2 也是单一且高效的解决方案因为 1) 它不需要根据字段映射中定义的值添加 null 值的开销。2索引大小也会变小导致索引变少搜索查询变快。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6