如何将 must_not 与 ElasticSearch + Grails 的空 JSON 属性一起使用?
Posted
技术标签:
【中文标题】如何将 must_not 与 ElasticSearch + Grails 的空 JSON 属性一起使用?【英文标题】:How to use must_not with an empty JSON attribute with ElasticSearch + Grails? 【发布时间】:2015-05-10 22:50:34 【问题描述】:我正在使用 Grails 插件在 mysql 上使用 ElasticSearch。我在我的域类中映射了一个域列,如下所示:
String updateHistoryJSON
(...)
static mapping =
updateHistoryJSON type: 'text', column: 'update_history'
在 MySQL 中,这基本上映射到一个 TEXT 列,其目的是存储 JSON 内容。
因此,在 DB 和 ElasticSearch 索引中,我都有 2 个实例: - 实例 1 有 updateHistoryJSON = '"zip":null,"street":null,"name":null,"categories":[],"city":null' - 实例 2 具有 updateHistoryJSON = ''
现在,我需要一个只返回实例 2 的 ElasticSearch 查询。
我一直在使用 Groovy DSL 进行这样的闭包:
bool
must_not = term(updateHistoryJSON: "")
minimum_should_match = 1
而 ElasticSearch 似乎忽略了它,它不断返回两个实例。
另一方面,如果我使用像“missing”:“field”:“updateHistoryJSON”这样的过滤器,它不会返回任何文档。 "exists" 也是如此:"field":"updateHistoryJSON"。
知道我在这里做错了什么吗?
【问题讨论】:
【参考方案1】:我仍然不确定是什么问题,但至少我找到了解决方法。
由于基于 updateHistoryJSON 内容的搜索不起作用,我决定使用脚本根据 updateHistoryJSON 内容大小进行搜索,意思是,我不查找具有非空 JSON 的文档,而是查找具有 updateHistoryJSON 的文档大小大于 2( == 大小 2)。
我使用的闭包是这样的:
script =
script = "doc['updateHistoryJSON'].size() > 2"
【讨论】:
以上是关于如何将 must_not 与 ElasticSearch + Grails 的空 JSON 属性一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot-spring-data-elasticsearch7.12.0
elk(elasticsearchlogstast,kibana)filebeat部署与实践
Elasticsearch如何在 Elasticsearch 中轻松编写脚本