【问题标题】:How can I retrieve matching children only?我怎样才能只检索匹配的孩子?
【发布时间】:2011-11-05 00:02:56
【问题描述】:

考虑一个非常简单的模型,其中我们有位置,每个位置可以有零个或多个事件。位置将具有名称、描述和地理点数据(经度/纬度)等属性。事件应附加到一个位置(其父级)并应具有名称和描述。

{
    "location" : {
        "properties": {
            "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
            "description": { "type": "string", "analyzer": "snowball" },
            "geo": { "type": "geo_point" },
            "exhibits": {
                "type": "nested",
                "properties": {
                    "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
                    "description": { "type": "string", "analyzer": "snowball" }
                }
            }
        }
    }
}

我想要做的是查询子文档(事件),对其名称和描述执行全文搜索。我想取回匹配的事件,并能够获得其父位置的名称。我还想按位置坐标缩小结果集的范围。我不想得到任何与查询不匹配的事件。这在 Elastic Search 中可行吗?我应该使用哪些类型的查询?

我尝试将事件作为数组属性放在位置下(见上文)并使用nested 查询,但它没有返回我想要的那种结果(我认为它返回整个位置,包括所有事件,甚至那些与我的查询不匹配的)。我尝试将事件放入提供 _parent 属性的单独索引(映射?),然后对位置执行 top_children 查询,但没有得到任何结果。

{
    "exhibit": {
        "_parent": { "type": "locations" },
        "properties": {
            "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
            "description": { "type": "string", "analyzer": "snowball" }
        }
    }
}

有人能解释一下吗?我不知道从哪里开始...

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    这是我的问题的有效解决方案,也许对某人有用。

    位置映射:

    {
        "location" : {
            "properties": {
                "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
                "description": { "type": "string", "analyzer": "snowball" },
                "geo": { "type": "geo_point" }
            }
        }
    }
    

    展品映射:

    {
        "exhibit": {
            "_parent": { "type": "locations" },
            "properties": {
                "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" },
                "description": { "type": "string", "analyzer": "snowball" }
            }
        }
    }
    

    查询:

    {
        "fields": [ "_parent", "name", "_source" ],
        "query": {
            "bool": {
                "should": [ 
                    { "text": { "name": "candy" } },
                    { "text": { "description": "candy" } } 
                ]
            }
        },
        "filter": { 
            "and": [
                {
                    "terms" : {
                        "_parent": [ "4e7089a9b97d640b30695b7a", "4e7089eeb97d640b30695b7b" ]
                    }
                },
                { "range": { "start": { "lte": "2011-09-22" } } },
                { "range": { "end": { "gte": "2011-09-22" } } }
            ]
        }
    }
    

    您应该使用_parent 字段进行查询,并将您希望限制展览的地点的ID 数组传递给它。

    【讨论】:

    • 很有帮助,谢谢分享。您使用什么 JSON 向位置添加新展览?
    • 很酷,但是如何检索父母的姓名? "fields": [ "_parent", "name", "_source" ]会找回孩子的名字吧?
    • @Yeggeps:是的,查询正在寻找某个文档的子项。你所要求的不属于我的场景。
    • 我看不出这如何解决原来的问题。您想要获取它在子结构中找到事件的父级名称。但在这里您放入父 ID 中要搜索的位置。或者我不明白"_parent": [ "4e7089a9b97d640b30695b7a", "4e7089eeb97d640b30695b7b" ]
    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多