2011-12-15 8 views
9

Muszę przeszukać potencjalnie dużą kolekcję zdań i nie mam pojęcia, od czego zacząć.Pisanie algorytmu wyszukiwania pełnotekstowego w C#/Entity Framework - od czego zacząć?

Podsumowując użytkownik prześle szukaną frazę, na przykład "jak usunąć moje konto", muszę przejść do bazy danych i wykonać dopasowanie z podanymi słowami.

W tej chwili mam na myśli zrobienie czegoś podobnego do poniższego: frazy

  • Splicie do poszczególnych słów
  • Usuń bardzo często używane słowa (a jeśli, etc)
  • Jakoś zamówić rozmowę według priorytetu (nie wiem jak to zrobić jeszcze)
  • Korzystanie pętlę EF poprzez słowa, robiąc String.Contains na każdym db rekordu i słowa
  • Jeśli nie znaleziono żadnych wyników, należy usunąć niektóre z LO priorytetowe słowa Wer i Szukaj ponownie
  • Powtórz

Czy ktoś może wskazać mi w dobrym kierunku? Także, jeśli ktokolwiek zna jakieś biblioteki do wykonywania tego rodzaju pracy, byłoby wspaniale.

Cheers

+5

Czy na prawdę chcesz napisać wyszukiwanie pełnotekstowe lub używasz go wystarczająco? Jeśli go używasz, możesz rzucić Lucene.net o problem. – CodesInChaos

+0

Chciałbym raczej użyć jednego niż właściwego – jcvandan

+0

Jednak wolałbym, aby wyszukiwanie stało się w SQL, jeśli to możliwe, naprawdę nie chcę zwrócić pełnego zestawu rekordów kiedykolwiek muszę szukać – jcvandan

Odpowiedz

6

Co do priorytetów słowa, proste, ale bardzo skuteczne rozwiązanie, aby posortować je według ich popularności (może Indeks popularności może być create na podstawie artykułów w bazie danych), tak, że słowa, które są rzadkością w swoich tekstach są ważniejsze, w ten sposób możesz zwiększyć słowa, które są mniej ogólne.

Innym problemem jest to, że możesz mieć słowa w różnych formach, takich jak czas przeszły/przyszły, dlatego możesz być zainteresowany stemming im, jednym narzędziem, które zostało przeniesione do C# jest projekt Snowball, o ile pamiętam .

Jeśli chodzi o drugą część problemu, zapętlenie słów może być bardzo nieefektywne, myślę, że powinieneś rozważyć użycie niektórych bibliotek/rozwiązań indeksujących. Jednym z popularnych dla .net jest Lucene.Net. Zasadniczo tworzy on odwrócony indeks, który odwzorowuje określone wyrażenia (np. Słowa) na artykuły, które je zawierają, co pozwala szybko znaleźć wszystkie wystąpienia danego słowa w twoich tekstach. Podobne podejście może zostać zaimplementowane samodzielnie w bazie danych:

+0

Zamierzam rzucić okiem na lucene, sprawdź, czy jest to odpowiednie, thx – jcvandan

2

Użyj SQL server full text search capability i zawiń zapytanie, używając wyszukiwania pełnotekstowego do procedury przechowywanej. Wykonaj procedurę przechowywaną za pośrednictwem ADO.NET lub EF.

3

Na wypadek, gdyby ktoś się z tym zetknął i zastanawiałem się, czego użyłem w końcu, w końcu skorzystałem z Lucene.NET. Jest fantastyczny, bardzo łatwy w konfiguracji i użyciu, ponieważ jest tak potężny i zapewnia tak wielką funkcjonalność. Jedną rzeczą, którą chciałbym powiedzieć jest to, że dokumentacja nie jest świetna. Jednak znalazłem serię tutoriali here, co jest dobrym wprowadzeniem. Spędziłem poranek przeglądając te artykuły i miałem absurdalnie szybki indeksowanie/wyszukiwanie pełnych tekstów w mojej aplikacji!

+3

Jeśli Twój problem został rozwiązany z powodu wysiłku @Ravadre, powinieneś rozważyć zaznaczenie dostarczonej odpowiedzi jako poprawnej, a nie twojej własne końcowe sprawozdanie z sukcesu. To nagradza ich za czas poświęcony na pomoc w znalezieniu tego rozwiązania. W przeciwnym razie po prostu klepiesz się po plecach, aby inni pomogli. : -o – BenSwayne

+0

prawda, nie wiem, dlaczego to zrobiłem ?! – jcvandan

Powiązane problemy