Эластичный поиск - ИЛИ фильтр с логическими и идентификаторами - PullRequest
2 голосов
/ 22 февраля 2012

Я пытаюсь найти элементы, некоторые из которых могут быть приватными.

Если элемент является личным, его могут видеть только друзья владельца элемента (массив item.friends).Если это не личное, то все могут это увидеть.

Так что моя логика такова: если элемент не is_private (is_private = 0) ИЛИ идентификатор пользователя (4в моем примере) находится в массиве item.friends, пользователь может видеть элемент.

Тем не менее я не получаю никаких результатов.Каждый элемент теперь имеет значение is_private = 1, так что я думаю, что-то не так с моим фильтром идентификаторов.

Есть предложения?

// ---- Mapping
{
    "item": {
        "properties": {
            "name": {
                "type": "string"
            },
            "description": {
                "type": "string"
            },
            "created": {
                "type": "date"
            },
            "location": {
                "properties": {
                    "location": {
                        "type": "geo_point"
                    }
                }
            },
            "is_proaccount": {
                "type": "integer"
            },
            "is_given_away": {
                "type": "integer"
            },
            "is_private": {
                "type": "integer"
            },
            "friends": {
                "type": "integer",
                "index_name": "friend"
            }
        }
    }
}

// ----- Example insert
{
    "name": "Test",
    "description": "Test",
    "created": "2012-02-20T12:21:30",
    "location": {
        "location": {
            "lat": "59.919914",
            "lon": "10.753414"
        }
    },
    "is_proaccount": "0",
    "is_given_away": "0",
    "is_private": 1,
    "friends": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
    ]
}

// -----  Query
{
    "from": 0,
    "size": 30,
    "filter": {
        "or": [
            {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "is_private": 0
                            }
                        }
                    ]
                }
            },
            {
                "ids": {
                    "values": [
                        4
                    ],
                    "type": "friends"
                }
            }
        ]
    },
    "query": {
        "match_all": {}
    }
}

1 Ответ

4 голосов
/ 22 февраля 2012

Фильтр "ids", вероятно, не означает, что вы думаете, что он означает: он фильтрует по идентификатору документа (и, необязательно, по типу документа.)

См. http://www.elasticsearch.org/guide/reference/query-dsl/ids-filter.html

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