2010-02-12 10 views
18

Muszę zaimplementować wyszukiwanie pełnotekstowe dla mojej aplikacji Django, uruchamiając MySQL jako backend.Szukanie pełnotekstowego MySQL Django

Powiedzmy mam model następująco:

class MyItem(models.Model): 
    title = models.CharField() 
    short_description = models.TextField() 
    description = models.TextField() 

chciałbym mieć wyniki wyszukiwania wyrażenia pierwszy wystąpień w tytule, następnie w SHORT_DESCRIPTION i na końcu w polu opisu. Będę szczęśliwszy, jeśli nie będę musiał używać dodatkowych modułów/aplikacji do tego zadania.

Odpowiedz

5

Jeśli szukasz beefy rozwiązanie polecam http://haystacksearch.org/

Jest bardzo dobrze przemyślane.

+0

Przypuszczam, że skończę z rozwiązaniem innej firmy, którego starałem się uniknąć. – edkirin

+0

Tak, może być konieczne wyjaśnienie, dlaczego takie rozwiązanie jest potrzebne? Ta opcja będzie niezależna od bazy danych i będzie skalować się wraz z dodawaniem modeli db do kryteriów wyszukiwania. Na przykład w projekcie zacząłem używać stogu siana dla jednego stołu, ale końcowy produkt miał dziesięć zapytań. Nie zapomnij, że jeśli wiesz dokładnie, czego chcesz w surowych warunkach sql, możesz go użyć. http://docs.djangoproject.com/en/dev/topics/db/sql/. Powodzenia – michael

23

Można użyć wyszukiwanie pełnotekstowe w Django

MyItem.objects.filter(title__search="some search text") 

Jedno jest - nie można określić pełny indeks z modelu Django, trzeba zrobić bezpośrednio w bazie danych (za pomocą phpMyAdmin lub SQL zapytań)

dokumentacja

See Django odnośnika do pola o nazwie search

+3

Więc nie ma sposobu, aby to zrobić w wielu kolumnach, prawda? –

+0

To nie działa domyślnie w przypadku korzystania z MySQL, ponieważ nie korzysta z typu tabeli MyISAM. Pojawia się błąd "Używany typ tabeli nie obsługuje indeksów FULLTEXT" – Timmmm

+0

@SilverLight, jak to zrobić z wieloma kolumnami, np. Dla złożonego indeksu wyszukiwania "FULLTEXT"? –

4

nie wiem, czy to pomaga, ale teraz mam utworzony nowy Python Library dla Django, który obsługuje MySQLs i MariaDBs natywną pełny tekst wyszukiwarka nad jednym lub wielu kolumn:

Można spojrzeć na to na GitHub repository

Jest również opis jak go zainstalować, używać i jak tworzyć rzeczy FULLTEXT INDEX poprzez migracje Django (Django 1.7+).

Jeśli skonfigurowany indeksy i ustawić SearchManager dla modelu powinien być w stanie uruchomić coś takiego:

Mymodel.objects.search('Something') 
Mymodel.objects.search('Somet*') 
Mymodel.objects.search('+Something -Awesome') 

Chciałem zaktualizować ten temat, bo nie mogę znaleźć rozwiązania możliwego do przyjęcia tak daleko i może to pomóc komuś tam jak dobrze :)

Cheers Domi

0

Od Django docs dotyczące wyszukiwania pełnotekstowego:

Przykład:

Entry.objects.filter(headline__search="+Django -jazz Python")

SQL równoważne:

SELECT ... WHERE MATCH(tablename, headline) AGAINST (+Django -jazz Python IN BOOLEAN MODE);

Uwaga ta jest dostępna tylko w MySQL i wymaga bezpośrednią manipulację bazy dodać pełny tekst indeks. Domyślnie Django używa trybu BOOLEAN do wyszukiwania pełnotekstowego. Dodatkowe informacje znajdują się w MySQL documentation.

Teraz do bezpośrednia manipulacja bazą danych. W MySQL można utworzyć indeksu pełnotekstowego, wykonując następujące kroki (source article)

  • Otwórz wiersz polecenia i wpisać mysql -u root -p. Po wyświetleniu monitu wpisz hasło root.
  • Wpisz use your_db_name, aby przełączyć się do bazy danych django.
  • Wpisz CREATE FULLTEXT INDEX index_name ON table_name (column_names).

To wszystko! Indeksowanie FTS włączone w bazie danych django. Teraz możesz użyć bogatego w django QuerySet API do wyszukiwania pełnotekstowego.

Powiązane problemy