2012-10-12 15 views
10

W jaki sposób można zaimplementować wyrażenie "Czy chodziło Ci o:" tak, jak Google ma w przypadku niektórych search queries?Jak zintegrować funkcję "Czy chodziło Ci o" w szynach?

PS: Używam sfinksa w moim produkcie. Czy możesz zasugerować, w jaki sposób mogę to wdrożyć. Wszelkie wskazówki i sugestie dla niektórych innych wyszukiwarek, które mają tę funkcjonalność są najbardziej mile widziane. Używam rails2.3.8, jeśli pomaga

Jednym rozwiązaniem może być:

Zrób słownika znanych „słowa kluczowe” lub „fraz” oraz w akcji wyszukiwania, jeśli nic nie zostanie znaleziony następnie uruchomić zapytanie wtórne w tym słowniku. Aktualizuj ten słownik za każdym razem, gdy tworzony jest wpis do wyszukiwania, blog lub nazwa użytkownika.

  • zapytanie = "supreman"

  • słowniku = [ "nadczłowiek", "Batman", "hanuman" ...] (tabela DB)

  • wyszukiwania (zapytanie)

  • razie bez rezultatów, wtedy

wyszukiwania w słowniku (gdzie "keyword" LIKE zapytanie lub zapytanie "LIKE") => "superman"

Sprawdź dokumentację Sfinksa lub Solr. Mogą mieć lepszą implementację tego zapytania "Lubię to", które zwraca wartość% dopasowania.

  • wyświetlacz -> Czy chodziło Ci o "Supermana"?

Ale chodzi o to, jak sprawić, by był wydajny?

Odpowiedz

1

Myślę, że szukasz algorytmów dopasowywania ciągów.

Pamiętam, mislav's gist używany do podnoszenia błędów, gdy zainicjować został lekko zapisany. To może być dobra lektura.

Również spojrzeć na niektóre z artykułów Sugeruje on:

+0

nie ma żadnego wbudowane rozwiązanie lub jakiś klejnot dodatek dla wyszukiwarek pełnotekstowych? –

+0

Gdybym musiał to zaimplementować, zacznę od patrzenia na ['pg_trgm'] (http://www.postgresql.org/docs/9.2/static/pgtrgm.html), ponieważ większość moich aplikacji już używa PostgreSQL. Kiedy ostatnio sprawdziłem, Sphinx nie ma takich rozmytych wyszukiwań, chyba że dostarczono je przez. – willglynn

+0

Używam MySQL :( –

5

Wystarczy popatrzeć na algorytmie odległość Damerau-Levenshtein. Oblicza "odległość" między dwoma ciągami i określa, ile kroków zajmuje przekształcenie jednego ciągu w drugi. Im mniej kroków, tym bliżej są dwa łańcuchy.

This Artykuł przedstawia algorytm zaimplementowany jako funkcja zapisana w MySQL.

Algorytm jest o wiele lepszy niż LIKE lub SOUNDEX.

Wierzę, że Google korzysta z danych pochodzących z tłumu, a nie z algorytmu. tzn. jeśli użytkownik wpisze abcd, kliknie przycisk "Wstecz", a następnie od razu przeszuka abd, ustali związek między dwoma wyszukiwanymi terminami, ponieważ użytkownik nie był zadowolony z wyników. Gdy masz bardzo duże wyszukiwanie w społeczności, pojawia się wzorzec.

+0

Link do artykułu zwraca 404 – chanchal118

+0

@ chanchal118 naprawiony –

2

Powinieneś rzucić okiem na rzeczywistą teorię tego, jak Google implementuje coś takiego: How to Write a Spelling Corrector.

Chociaż artykuł ten jest napisany w języku Python, w dolnej części artykułu znajdują się linki do implementacji w innych językach. Oto Ruby implementation.

1

Teraz dni miałeś na myśli, że funkcja jest realizowana w oparciu o fonetyczny korektor pisowni. Kiedy błędnie pisujemy, zazwyczaj piszemy fonetycznie podobne słowa. Na podstawie tego pomysłu fonetyczny korektor zaklęć przeszukuje swoją bazę danych pod kątem najbardziej podobnego słowa. Więzi podobieństwa są łamane za pomocą kontekstu (w przypadku zapytania wielowyrazowego inne słowa również pomagają w wyborze właściwego słowa) i popularności słowa. Jeśli dwa słowa są fonetycznie bardzo zbliżone do błędnie napisanego słowa, to wybiera się słowo, które pasuje do kontekstu i jest częściej używane w życiu codziennym.

1

to pracuje dla mnie:

SELECT * FROM table_name WHERE soundex(field_name) LIKE CONCAT('%', soundex('searching_element'), '%') 
+0

W każdym razie możesz podać przykłady tego, co to jest dopasowanie w oparciu o wyszukiwane hasło. Poszukując rzeczy, które pasują do transponowanych znaków, najprawdopodobniej wyrzuciłoby to EG : szukanie ALGP zamiast ALPG, gdy ALPG i ALFG były dostępne do wyszukania. – fyrye