Как я могу получить только совпадающих детей? - PullRequest
8 голосов
/ 15 сентября 2011

Рассмотрим очень простую модель, в которой у нас есть местоположения, и у каждого местоположения может быть ноль или более событий.Местоположение будет иметь такие свойства, как имя, описание и данные географической точки (долг / широта).Событие должно быть прикреплено к одному местоположению (его родительскому) и должно иметь имя и описание.

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

Может ли кто-нибудь сбросить некоторые данные?свет?Я не знаю с чего начать ...

1 Ответ

8 голосов
/ 04 ноября 2011

Вот рабочее решение моей проблемы, возможно, оно кому-нибудь пригодится.

Отображение местоположения:

{
    "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 и передав ему массив идентификаторов мест, которыми вы хотите ограничить экспонаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...