7

Zbudowałem aplikację ASP.NET MVC z MVC 2.0 i Fluent NHibernate (ukryte za repozytoriami z kilku powodów). Aplikacja reprezentuje dość złożoną domenę z różnymi obiektami, takimi jak użytkownicy, wiadomości, komentarze, pliki i terminy.Jaki jest najlepszy sposób wdrożenia pełnego przeszukiwania aplikacji ASP.NET MVC?

Teraz chcę zaimplementować wyszukiwanie pełnotekstowe, które pozwala użytkownikowi łatwo znaleźć wszystkie rodzaje treści, po prostu wpisując szukaną frazę. Kiedy osobno obsługujemy wszystkie typy obiektów w różnych aplikacjach, teraz muszę je "połączyć" w celu wyszukania. Oznacza to, że użytkownik nie rozróżnia różnych typów, po prostu wpisuje "xyz" i chce uzyskać wyniki na liście, komentarze pomieszane z wiadomościami itp.

Opcja 1 polega na utworzeniu usługi wyszukiwania, która pobiera wyszukiwanie wynik z różnych repozytoriów i przygotowuje połączone dane wyjściowe (sortowanie, stronicowanie itp.). Ale to naprawdę, bardzo drogie, gdy dane za nimi rosną (i będą rosły).

Poszukuję alternatywnego rozwiązania. Obecnie pracuję z programem SQL Server 2008. Znalazłem lucene.net (http://lucene.apache.org/lucene.net/), ale nie zainwestowałem zbyt wiele czasu.

Wszelkie sugestie?

Odpowiedz

2

Zdecydowanie skorzystam z funkcji pełnego tekstu SQL. Rozumiem, że niektóre treści mogą być dostępne w plikach, innych strukturach, ale nawet wtedy większość danych powinna znajdować się w backendach, a SQL wykonuje dobrą pracę z pełnowartościowymi indeksami w architekturze.

Proponuję zacząć od pełnego tekstu SQL i utworzyć niewielki komponent, który wysyła zapytanie do innych zasobów (jeśli jest to wymagane). Zakładam, że 80% przeszukiwalnych treści pochodzi z SQL Server.

Oto kilka zasobów, aby rozpocząć korzystanie z programu SQL Server fulltext:

  1. http://msdn.microsoft.com/en-us/library/ms142571.aspx
  2. http://www.dotnetfunda.com/articles/article1019-implementing-fulltext-search-on-view-.aspx?sms_ss=dotnetshoutout
+0

To nawet 100% danych pochodzących z SQL Server. Tak więc masz rację, po prostu biorę starą dobrą drogę, może nawet z zapisaną procedurą lub prostą ADO.NET - na szczęście wciąż używam repozytoriów. –

2

Dla .Net można zajrzeć do RavenDB, który wykorzystuje lucene jako miejsce przechowywania indeksów, i dostarczy możliwości wyszukiwania Lucene jako bonus. Może być łatwiejszy w użyciu. Z pewnością bardziej elastyczny i lepszy interfejs API. Ale powinieneś zajrzeć do pamięci masowej.

W zależności od potrzeb można włączyć Full Text Search w SQL Server, co daje dodatkowe możliwości zapytania z SQL. W ten sposób nie trzeba zarządzać innym indeksem poza danymi bazy danych. Jeśli twoje dane znajdują się w kilku repozytoriach, lepszym rozwiązaniem może być użycie zewnętrznego indeksu, takiego jak Lucene.

Podobnie jak w przypadku innych pełnotekstowych wyszukiwarek, masz Microsoft Search Server Express, ale może być konieczne utworzenie własnego konektora treści, aby uzyskać dane (ponownie w zależności od repozytoriów).

+0

@jfar: Zmieniono moją odpowiedź, aby to odzwierciedlić. Nadal uważam, że używanie RavenDB jako zamiennika Lucene bezpośrednio jest opcją ze względu na oferowane przez nią API. –

+0

zaktualizowałem mój głos i usunąłem komentarz, aby odzwierciedlić Twoją edycję;) – jfar

0

prostu mówiąc: "Zastosowanie pełny" nie wystarcza. Jego rozwiązanie niekoniecznie polega na bardziej zaawansowanym wyszukiwaniu tekstów w obrębie każdego typu jednostki. Musi mieć możliwość przesłania zapytania do indeksu dla dowolnego typu jednostki na podstawie ciągu zapytania. Mogłem zobaczyć, używając NHibernate.Search jako metody do wypełnienia indeksu Lucene, ale nie wiem, czy jego możliwości obsługują przeszukiwanie indeksu niezależnie od typu dokumentu indeksu (utrzymywana jest klasa NHibernate). Być może będziesz musiał przesłać zapytanie do indeksu Lucene bardziej bezpośrednio i zinterpretować wyniki dla wyświetlenia lub bezpośredniego pobrania obiektu bazowego w DB serwera SQL przez samą NHibernate.

Powiązane problemy