Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Fulltext index wyszukiwanie
Forum PHP.pl > Forum > Bazy danych > MySQL
pitu
Witam

Dodałem na kolumnę Fulltext Index w celu optymalizacji, chciałbym teraz wyszukiwać w tabeli po tym indeksie.

Index:
  1. CREATE FULLTEXT INDEX index_mp3 ON mp3_search(search_txt);


W celu wyszukania z wykorzystaniem stworzonego indeksu zamieniłem zwykłe zapytanie Select ... From ... Where ... na:
  1. SELECT * FROM mp3_search WHERE MATCH(search_txt) AGAINST('"rihanna-only"');



Problem w tym, że wynikiem owego zapytania musi być jeden rekord, w którym znajduje się identyczna fraza. W bazie frazy zawierają znak minus (-), który jest w tym przypadku znakiem specjalnym.

Pytania:
Jak zwrócić jeden dokładnie pasujący rekord?
Noidea
Nie jestem pewny w 100%, ale wydaje mi się, że się nie da. Jedyne co możesz zrobić gdy szukasz wyrażenia ze znakami specjalnymi, to ograniczyć znacząco ilość wierszy przy użyciu wyszukiwania pełnotekstowego, a następnie oczyścić dokładnie wynik przy użyciu LIKE:

  1. SELECT *
  2. FROM (
  3. SELECT *
  4. FROM mp3_search
  5. WHERE MATCH( `search_txt` ) AGAINST( '"rihanna-only"' IN BOOLEAN MODE )
  6. ) ms
  7. WHERE `search_txt` LIKE '%rihanna-only%'

pitu
Tak tylko chciałem z optymalizować zapytania, a szukanie po indeksie, a następnie filtrowanie po przez like nie wiem czy da jakiś plus do zwykłego
  1. SELECT *
  2. FROM mp3_search
  3. WHERE search_txt="rihanna-only";
erix
Strzelam, że wystarczy zaescape'ować znak minusa:
Kod
asdasdasd\-sdfsdf
Noidea
@pitu120 Jeśli w polu search_txt nie masz nic więcej oprócz "rihanna-only" to nie używaj indeksu pełnotekstowego. Tracisz tylko wtedy na wydajności i pojawiają się takie właśnie problemy ze znakami specjalnymi. Użyj zwykłego indeksu.


@erix To była pierwsza rzecz którą sprawdziłem - nie działa. W manualu nie ma żadnej wzmianki o znakach ucieczki. Dodatkowo znalazłem to:
Cytat
Generally, anything that's alphabetic or numeric (including accented characters) is part of a word, anything that's not alphabetic or numeric (even "-") is not part of a word and is therefore used as a separator.

http://dev.mysql.com/tech-resources/articl...t-revealed.html
Ma to prawdopodobnie związek z tym jak tworzony jest indeks słów. Bez sensu byłoby oprócz pojedynczych słów dodawać do indeksu też pary słów, trójki, czwórki, itd. na wypadek, gdyby ktoś chciał wyszukać dokładną frazę "ala ma kota". No i rykoszetem oberwały też pary słów oddzielone innym znakiem niż spacja czy enter.
pitu
@Noidea w search_txt przechowywane są wyszukiwane nazwy piosenek, podany wyżej to tylko przykład.
Noidea
Nie o to mi chodzi. Pytałem, czy w polu search_txt może znaleźć się: "Moja ulubiona piosenka to rihanna-only, jest super", czy będzie tam tylko "rihanna-only".
Ogólnie, to jeśli takie zapytanie ci działa:
  1. SELECT *
  2. FROM mp3_search
  3. WHERE search_txt="rihanna-only";

i zastanawiasz się tylko, czy użycie indeksu pełnotekstowego będzie szybsze, to odpowiedzią jest: nie będzie.


Możesz przyjąć, że FULLTEXT przydaje się, jeśli chcesz zoptymalizować takie zapytanie
  1. SELECT *
  2. FROM forum.posty
  3. WHERE tresc_postu LIKE '%slowo1%' OR tresc_postu LIKE '%slowo2%' OR tresc_postu LIKE '%slowo3%'

w twoim przypadku należy użyć zwykłego indeksu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.