Индивидуальный пользовательский поисковый движок с ElasticSearch/Django Haystack

Мы находимся в процессе написания приложения django, которое позволяет пользователям отправлять личные сообщения между собой, а также отправлять сообщения группе и ищет возможности для индивидуальной настройки поиска для каждого пользователя, чтобы каждый пользователь мог искать и просматривать только сообщения. они получили.

Как мы предлагаем опыт поиска, настроенный для каждого пользователя? Некоторые сообщения являются частью потоков, отправляемых тысячам пользователей как часть группы, тогда как другие могут быть личными сообщениями, отправляемыми между двумя пользователями, и даже другие могут быть "ожидающими" сообщениями, которые хранятся для модерации.

Будем ли мы жестко кодировать фильтры, определяющие, может ли пользователь просматривать сообщение в каждом запросе, который мы отправляем в ElasticSearch, или если сообщение отправляется в группу из 1000 участников, я должен добавить 1000 идентичных документов в ElasticSearch, и единственное, что меняется, это получатель?

Обновить

Итак, вот отдельное сообщение в сериализованной форме:

{
            "snippet": "Hi All,Though Marylan...", // Friendly snippet, this will be needed in the result
            "thread_id": 28719, // Unique ID for this thread
            "thread_title": "Great Thread Title Here", // Title for the thread, will be used to diplay in search results
            "sent_at": "2015-03-19 07:28:15.092030-05:00", // Datetime the message was originr
            "text": "Clean Message Test Here", // Text to be queryable
            "pending": false, // If pending, this should only appear in the search results of the sender
            "id": 30580, // Unique ID for this message across the entire
            "sender": {
                "sender_is_staff": false, // If the sender is a staff member or not (Filterable)
                "sender": "Anna M.", // Friendly name (we'll need this to display on the result page)
                "sender_guid": "23234304-eeee-bbbb-1234-bfb19d56ad68" // Guid of sender (necessary to display a link to the user's profile in the result)
            },
            "recipient" {
                  "name": "", // Not filled in for group messages
                  "recipient_guid": "" // Not filled in for group messages
            }
            "type": "group", // Values for this can be 'direct' or 'group'
            "group_id": 43 // This could be null
}

Пользователь должен иметь возможность искать:

  1. Все сообщения, которые они являются "отправителем"
  2. Все сообщения, где их GUID находится в области "получателя" (а "тип" - "прямой")
  3. Все сообщения, отправленные на идентификаторы групп, членами которых они являются, не ожидают (хотя они могут быть членами 100 групп, хотя это может быть [10,14,15,18,25,44,50,60,75,80,81,82,83,...])

В SQL это было бы SELECT * FROM messages WHERE text contains 'query here' AND (sender.guid = 'my-guid' OR recipient.guid = 'my-guid' OR (group_id in [10,14,15,18,25,44,50,60,75,80,81,82,83,...] AND pending != True))

1 ответ

Надеюсь, я правильно понимаю вашу проблему.

Итак, у вас есть система обмена сообщениями, где есть 3 типа сообщений (групповые, 2 пользователя, модерируемые). Ваша цель - разрешить пользователям осуществлять поиск по всем сообщениям с возможностью применения фильтров по типу, пользователю, дате и т. Д.

Воспользуйтесь преимуществами масштабируемой природы ElasticSearch для хранения данных, доступных для поиска. Сначала рассмотрим серверы, на которых работают узлы ES. Достаточно ли у них ресурсов (памяти, процессора, сети, скорости жесткого диска) для вашего трафика и размера / количества ваших документов? После того, как вы определились со спецификациями сервера, вы можете просто добавить больше по мере необходимости для распространения данных и обработки.

Затем создайте структуру вашего сообщения. Я полагаю, что ваше отображение может выглядеть примерно так:

"message": {
"properties": {
    "id": {
        "type": "long"
    },
    "type": {
        "type": "string"
    },
    "body": {
        "type": "string"
    },
    "from_user": {
        "type": "object",
        "properties": {
            "id": {
                "type": "integer"
            },
            "name": {
                "type": "string"
            }
        }
    },
    "to_user": {
        "type": "object",
        "properties": {
            "id": {
                "type": "integer"
            },
            "name": {
                "type": "string"
            }
        }
    },
    "group": {
        "type": "object",
        "properties": {
            "id": {
                "type": "integer"
            },
            "name": {
                "type": "string"
            }
        }
    },
    "added_on": {
        "type": "date"
    },
    "updated_on": {
        "type": "date"
    },
    "status_id": {
        "type": "short"
    }
}}

Возможно, вы захотите создать собственные анализаторы для полей "тело" и "имя", чтобы настроить результаты поиска в соответствии с вашими ожиданиями. Тогда это просто вопрос написания запросов и использования фильтров / сортировок, чтобы пользователи могли осуществлять поиск по всему миру или из / к конкретным пользователям или группам.

После этого вам просто нужно установить мост между вашей базой данных и индексом ES для синхронизации ваших сообщений для поиска. Частота синхронизации зависит от того, насколько быстро вы хотите, чтобы сообщения были доступны для поиска.

Ну, я искренне надеюсь, что правильно понял ваш вопрос. В противном случае, хорошо...

Другие вопросы по тегам