考虑一个非常简单的模型,我们有位置,每个位置可以有零个或多个事件。位置将具有名称,描述和地理点数据(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" }
}
}
}
有人可以解决一些问题吗?我不知道从哪里开始...
答案 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。