如何将 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

ElasticSearch 使用详解:组合查询怎么玩

elk(elasticsearchlogstast,kibana)filebeat部署与实践

Elasticsearch如何在 Elasticsearch 中轻松编写脚本

利用kibana插件对Elasticsearch进行bool查询

ES 译文之如何使用 Logstash 实现关系型数据库与 ElasticSearch 之间的数据同步