【问题标题】:Get Correct Elasticsearch Document Returned if Matches Query Terms and Is Newest Document如果匹配查询词并且是最新文档,则返回正确的 Elasticsearch 文档
【发布时间】:2019-08-29 12:27:18
【问题描述】:

我正在尝试搜索以返回仅当最新文档与所查询的任何术语匹配时才返回的最新文档。

考虑以下文件:

submitterId:635535 action:CREATE billerId:009207 marketBase:RH submitterDisabled:N versionDate:20190818141059
submitterId:635535 action:UPDATE billerId:009207 marketBase:RH submitterDisabled:N versionDate:20190827170044
submitterId:635535 action:UPDATE billerId:009207 marketBase:RH submitterDisabled:Y versionDate:20190827174522

我想要的是用户搜索任何元素(减去 versionDate)并且只找到组中的最新文档。额外的警告是,如果他们搜索的值与最新文档中的任何内容都不匹配,则不应返回任何内容。

示例: 搜索“submitterDisabled=N”。考虑到上面的示例文档,不应返回任何内容,因为最新记录不包含匹配值。它有“submitterDisabled="Y"。

不幸的是,我们的查询设置方式是在对 versionDate 进行任何类型的聚合之前对术语进行直接匹配。我知道这是问题所在,但不知道如何解决。警告,我对 ES 非常陌生。

有人知道这里可能发生了什么吗?

GET _search
{
    "size":0,
    "query":{
        "bool":{
            "must":[
                {
                    "term":{"submitterId.keyword":"635535"}
                },
                {
                    "wildcard":{"marketBase.keyword":"*"}
                },
                {
                    "term":{"submitterDisabled.keyword":"N"}
                }]
        }
    },
    "aggs":{
        "group":{
            "terms":{
                "field":"submitterId.keyword",
                "size":10000
            },
            "aggs":{
                "group":{
                    "terms":{
                        "field":"marketBase.keyword"
                    },
                    "aggs":{
                        "group_docs":{
                            "top_hits":{
                                "size":1,
                                "sort":{
                                    "versionDate.keyword":{"order":"desc"}
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您将不得不稍微更改您的查询。

    首先,由于您总是希望使用"submitterDisabled.keyword":"Y" 获取元素,因此您可以在查询中设置它,无论您的用户选择什么,您将始终返回该值等于“Y”的元素。

    现在,对于您的文档只需要与一个字段的值匹配的部分,您可以添加一个should 条件。

    must 用作 AND,而 should 用作 OR。因此,在您的查询中设置一个应该条件将只返回与这些值中的至少一个匹配的文档。

    最后,您只需混合我之前所说的内容,您的查询将是这样的:

    {
        "query":{
            "bool":{
                "must":[
                    {
                        "term":{"submitterDisabled.keyword":"Y"}
                    }
                ],
                "should":[
                        {
                            "term":{"submitterId.keyword":"635535"}
                        },
                        {
                            "wildcard":{"marketBase.keyword":"*"}
                        }
                    ]
            }       
        }
    }
    

    希望这有帮助! :D

    【讨论】:

    • 另外,如果你不想用 "submitterDisabled.keyword":"N" 显示结果,你可以做两件事: 1. 不要让你的用户选择选项或2. 如果他们选择了该选项,则根本不进行查询并返回一个空字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    相关资源
    最近更新 更多