Могу ли я использовать Elasticsearch с данными, для просмотра которых требуется проверка подлинности (например, только для пользователей) - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу реализовать поиск на своем веб-сайте. Пользователи должны иметь возможность искать товары, которые они имеют в своем магазине. Очевидно, что возвращаемые товары должны быть только их собственными, если клиенты выполняют поиск на своем веб-сайте. Как я могу реализовать это? с Elasticsearch? Очевидно, что мой бэкэнд будет выполнять запрос, а не внешний интерфейс, но как я ограничу результаты поиска только для одного пользователя. Это возможно только через фильтрацию с моим собственным кодом. ГДЕ из sql? Я поступаю неправильно? Будет ли лучше, если я использую полнотекстовый поиск из PostgreSQL.

Я использую GO кстати.

С наилучшими пожеланиями

Обновление: Мой вариант использования по запросу:

Пользователь связан с ID. Он находится в своей панели инструментов и ищет продукт, который есть в его магазине. Его запросы проходят сеанс Token Cook ie и я получаю его идентификатор на своем сервере. Затем мне нужно получить продукты, которые соответствуют его запросу и только его.

В SQL это будет, например, SELECT * FROM products WHERE shop_id=ID. это возможно с Elasticsearch? Это больше проблем, чем стоит вместо реализации полнотекстового поиска на PostgreSQL?

1 Ответ

1 голос
/ 25 апреля 2020

Iy может быть легко достигнуто с помощью Elasticsearch, и вы должны определить shop_id в качестве поля ключевого слова, а затем использовать его в контексте фильтра запроса, чтобы убедиться, что вы ищете только товары, принадлежащие конкретному shop_id.

Использование shop_id в контексте фильтра также значительно повышает производительность поиска, так как они по умолчанию кэшируются в Elasticsearch, как описано в официальном do c

В контексте фильтра предложение запроса отвечает на вопрос «Соответствует ли этот документ этому предложению запроса?» Ответ прост: да или нет - баллы не рассчитываются. Контекст фильтра в основном используется для фильтрации структурированных данных, например,

Установлено ли в поле состояния значение «опубликовано»?

Elasticsearch автоматически кэширует часто используемые фильтры для повышения производительности.

Пример сопоставления и запроса в соответствии с вашими требованиями:

Индексное отображение

{
    "mappings" :{
        "properties" : {
            "product" : {
                "type" : "text"
            },
            "shop_id" :{
                "type" : "keyword"
            }
        }
    }
}

Индексные образцы документов для двух идентификаторов магазина различий

{
    "product" : "foo",
    "shop_id" : "stackoverflow"
}

{
    "product" : "foo",
    "shop_id" : "opster"
}

Поиск foo товара, где shop_id равен stackoverflow

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "product": "foo"
                    }
                }
            ],
            "filter": [
                {
                    "term": {
                        "shop_id": "stackoverflow"
                    }
                }
            ]
        }
    }
}

Результат поиска

 "hits": [
            {
                "_index": "productshop",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.18232156,
                "_source": {.  --> note only foo belong to `stackoverflow` returned
                    "product": "foo",
                    "shop_id": "stackoverflow"
                }
            }
        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...