Сложные запросы с эластичной поисковой фильтрацией - PullRequest
0 голосов
/ 02 июля 2019

У меня есть база данных PostgreSQL, содержащая новостные статьи, проанализированные из Интернета.Парсер работает каждый час, собирает новые новости и сохраняет их в БД.Пользователи приложения могут добавлять определенные ключевые слова в свой профиль, чтобы в случае обнаружения нового элемента новостей, содержащего ключевое слово, они были уведомлены.В настоящее время я использую SQL-запрос для этого, поэтому всякий раз, когда я получаю новую новостную статью, я пытаюсь сопоставить ее со всеми ключевыми словами, добавленными пользователями, а затем отправлять уведомления, но это занимает много времени.Так что я думаю об интеграции Elasticsearch.Я столкнулся с перколяционным запросом , но я не могу найти хорошую документацию вокруг него, поэтому не уверен, смогу ли я создать сложные запросы с его помощью.Для поиска необходимо учитывать следующее:

  1. Пользователи могут добавлять ключевые слова с помощью AND, OR, NOT, и нам необходимо «искать все», «любой», «не содержащий» соответственно.Например, пользователь может указать такие ключевые слова, как «Биткойн» И «Криптовалюта», а не «Майнинг», тогда в этом случае этот поисковый запрос должен соответствовать только новостным статьям, содержащим слова «Биткойн» и «Криптовалюта», и не должен содержать слово «Майнинг».Ключевые слова могут быть где угодно в заголовке или теле статьи
  2. .Таким образом, если ключевые слова пользователя содержат «дождь», а статья содержит слово «дождь», то при поиске по запросу все равно должен возвращаться идентификатор для этого ключевого слова
  3. Пользователь также может указать автора в качестве ключевого слова, и в этом случае нам необходимо вернуть статьикоторые были созданы этим автором

1 Ответ

0 голосов
/ 02 июля 2019

Спасибо за точность.

Чтобы использовать перколятный запрос в вашем случае, вам необходимо:

  1. Создать индекс, определяющий отображение вашей статьи, информацию о вашемusers и percolator query, соответствующий предпочтениям пользователя.
PUT /percolated_queries_index
{
    "mappings": {
        "properties": {
            "article": {
                // Mapping for your article
            },
            "query": {
                "type": "percolator"
            },
            "user": {
                // Mapping for the information related to the user
            }
        }
    }
}

Поле article является обязательным, поскольку документы статьи, которые вы будете фильтровать, будут использовать это отображение.Вероятно, это должно быть то же отображение, которое вы используете в индексе article.Как упомянуто в документации, вы должны видеть это отображение как предварительную обработку документа, который вы будете сопоставлять.Например, вам нужно будет указать анализатор стволов здесь.

индексировать для каждого пользователя поисковый запрос, соответствующий его пользовательскому предпочтению, в поле percolator.
PUT /percolated_queries_index/_doc
{
    "query" : {
        // The elasticsearch query corresponding to the user preferences
    },
    "user": {
        // Information for the user, e.g., id, email
    }
}

Запрос соответствует пользовательским предпочтениям, переписанным как запрос эластичного поиска.Например, запрос на совпадение для автора статьи и логические запросы для ключевых слов AND, OR, NOT.Это будет, вероятно, трудная часть, потому что вам придется написать что-то, что преобразует пользовательский запрос в запрос эластичного поиска.Если вы можете использовать синтаксис строки запроса , это должно быть намного проще.

Не следует устанавливать здесь поле article.

Когда новая статья проиндексирована, выполните поисковый запрос percolate, используя эту статью в параметре document.Если статья уже проиндексирована, вы также можете напрямую использовать ее идентификатор (синтаксис приведен в документе).
GET /percolated_queries_index/_search
{
    "query" : {
        "percolate" : {
            "field" : "query",
            "document" : {
                // The content of the article
            }
        }
    }
    "_source": "user"
}

Ответ на этот запрос вернет документы, содержащие запрос, соответствующий запросу.документ статьи, включающий информацию пользователя, соответствующую статье.Поскольку вас обычно не интересует сам поисковый запрос, вы можете выполнить фильтрацию, чтобы получить только поле user.

Ответ на этот запрос даст вам всех пользователей, которым будет отправлена ​​новая статья..

...