Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Fulltext index wyszukiwanie
pitu
post
Post #1





Grupa: Zarejestrowani
Postów: 476
Pomógł: 96
Dołączył: 10.04.2008
Skąd: Koszalin

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Noidea
post
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


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%'

Go to the top of the page
+Quote Post
pitu
post
Post #3





Grupa: Zarejestrowani
Postów: 476
Pomógł: 96
Dołączył: 10.04.2008
Skąd: Koszalin

Ostrzeżenie: (0%)
-----


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";


Ten post edytował pitu120 14.12.2010, 19:11:05
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Strzelam, że wystarczy zaescape'ować znak minusa:
Kod
asdasdasd\-sdfsdf
Go to the top of the page
+Quote Post
Noidea
post
Post #5





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


@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.

Ten post edytował Noidea 14.12.2010, 21:45:06
Go to the top of the page
+Quote Post
pitu
post
Post #6





Grupa: Zarejestrowani
Postów: 476
Pomógł: 96
Dołączył: 10.04.2008
Skąd: Koszalin

Ostrzeżenie: (0%)
-----


@Noidea w search_txt przechowywane są wyszukiwane nazwy piosenek, podany wyżej to tylko przykład.
Go to the top of the page
+Quote Post
Noidea
post
Post #7





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.12.2025 - 20:13