根据 Elasticsearch 文档,无法索引或搜索空值 null。 当一个字段设置为 null(或空数组或空值数组)时,它被视为该字段没有值。
那么如何找到 product_name 为空(null)的文件呢?
你可以在配置索引映射时定义 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" } } ] } } `![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
什么??? 为什么 Elasticsearch 只返回一个文档而不返回第二个具有空数组的文档? 因为,
此外,product_name 值仅作为 null 而不是作为在索引映射中设置的 NULL。 因为,
现在,当 product_name 为 null 或空数组时,如何将两个文档都放入结果中?
让我们定义没有 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" } } ] } } `![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
将 must_not 与 exists 查询一起使用的优点: