Где / Как разместить Solr в приложении ASP.net MVC (с использованием nHibernate / Repository Pattern)

В настоящее время я работаю над достаточно большим приложением на основе вопросов / ответов (вроде stackoverflow / answerbag.com) Мы используем SQL (Azure) и nHibernate для доступа к данным и MVC для приложения пользовательского интерфейса.

Пока что схема примерно аналогична stackoverflow db в том смысле, что у нас есть один Post таблица (содержит оба вопроса / ответа)

Вероятно, я собираюсь использовать что-то вроде следующего интерфейса репозитория:

public interface IPostRepository
{
    void PutPost(Post post);
    void PutPosts(IEnumerable<Post> posts);

    void ChangePostStatus(string postID, PostStatus status);

    void DeleteArtefact(string postId, string artefactKey);
    void AddArtefact(string postId, string artefactKey);

    void AddTag(string postId, string tagValue);
    void RemoveTag(string postId, string tagValue);

    void MarkPostAsAccepted(string id);
    void UnmarkPostAsAccepted(string id);

    IQueryable<Post> FindAll();
    IQueryable<Post> FindPostsByStatus(PostStatus postStatus);
    IQueryable<Post> FindPostsByPostType(PostType postType);
    IQueryable<Post> FindPostsByStatusAndPostType(PostStatus postStatus, PostType postType);
    IQueryable<Post> FindPostsByNumberOfReplies(int numberOfReplies);
    IQueryable<Post> FindPostsByTag(string tag);
}

Мой вопрос: Куда и как мне вписать в это solr, чтобы лучше запрашивать эти "сообщения" (Я буду использовать solrnet для фактического взаимодействия с Solr)

В идеале, я бы использовал базу данных SQL как просто постоянное хранилище - Большая часть вышеупомянутых операций IQueryable переместится в какой-то класс SolrFinder (или что-то в этом роде)

Свойство Body вызывает проблемы в настоящее время - оно довольно велико и замедляет запросы на sql.

Моя основная проблема, например, заключается в том, что если кто-то «обновляет» сообщение - например, добавляет новый тег, тогда весь этот пост потребуется переиндексировать. Очевидно, что для этого потребуется следующий запрос:

«SELECT * FROM POST WHERE ID = xyz»

Это, конечно, будет очень медленным. В Solrnet есть средство nHibernate, но я считаю, что это будет тот же результат, что и выше?

Я придумал способ обойти это, и мне бы хотелось, чтобы ваше мнение о нем:

  • Добавление идентификатора в очередь (amazon sqs или что-то в этом роде - мне нравится простота использования с этим)
  • Наличие службы (или группы служб) где-то, которая выполняет вышеупомянутый запрос, создает документ и повторно добавляет его в solr.

Другая проблема I с моим дизайном: Откуда следует вызывать метод (ы) "переиндексации"? Контроллер MVC? или я должен иметь класс типа "PostService", который является оболочкой для экземпляра IPostRepository?

Любые указатели принимаются на этот счет!

11
задан Alex 8 September 2010 в 23:11
поделиться