我怎样才能找回匹配的孩子?

时间:2011-09-15 13:46:07

标签: elasticsearch

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

{
    "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" }
                }
            }
        }
    }
}

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

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

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

有人可以解决一些问题吗?我不知道从哪里开始...

1 个答案:

答案 0 :(得分:8)

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

位置映射:

{
    "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。