Сейчас я нахожусь в середине достаточно большого вопроса на основе ответа на вопрос (вроде 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 DB как просто постоянный магазин, Основная часть вышеперечисленных операций IQueryable переместилась бы в какой-то класс SolrFinder (или что-то в этом роде)
Свойство Body является тем, которое вызывает проблемы в настоящее время - оно довольно велико и замедляет запросы на sql.
Моя основная проблема заключается, например, в том, что если кто-то "обновляет" сообщение - добавляет новый тег, например, то всему сообщению потребуется повторная индексация. Очевидно, для этого потребуется такой запрос:
"SELECT * FROM POST WHERE ID = xyz"
Это, конечно, будет очень медленным. Solrnet имеет объект nHibernate, но я верю, что это будет тот же результат, что и выше?
Я подумал об этом, о чем я хотел бы взглянуть на:
- Добавление идентификатора в очередь (amazon sqs или что-то - мне нравится простота использования с этим)
- Если у вас есть сервис (или куча сервисов), который выполняет вышеупомянутый запрос, создайте документ и снова добавьте его в solr.
Еще одна проблема, с которой я сталкиваюсь: Откуда должен быть вызван метод переиндексации? Контроллер MVC? или должен ли я иметь класс типа "PostService", который обертывает экземпляр IPostRepository?
Любые указатели получаются на этом!