2009-02-25 13 views
8

Potrzebuję więc dowiedzieć się, jak wykonać pełnotekstowe wyszukiwanie boolowskie w bazie danych MySQL, aby zwrócić rekord zawierający termin "C++".W jaki sposób uzyskujesz boolowskie wyszukiwanie pełnotekstowe, aby wybrać termin C++?

Mam SQL wyszukiwarki ciąg jako:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ("C++" IN BOOLEAN MODE) 

Mimo wszystkich moich polach zawierać ciąg C++, to nigdy nie jest zwracany w wynikach wyszukiwania.

Jak mogę zmodyfikować MySQL, aby to uwzględnić? Czy to możliwe?

Jedyne rozwiązanie, jakie znalazłem, to uniknięcie znaku + podczas wprowadzania moich danych jako "__plus", a następnie modyfikowanie wyszukiwania w celu dostosowania, ale wydaje się to uciążliwe i musi istnieć lepszy sposób .

+0

Co do cholery jest pełnotekstowym wyszukiwaniem Boolean? Brzmi strasznie, jakbyś wymyślił to słowo. Ponadto twoje pytanie jest bardzo niejasne. Musisz podać dokładniejszy opis problemu, co próbujesz zrobić. W przeciwnym razie nie możemy ci pomóc. –

+0

@John: Jesteś bardzo surowy. Musiałem powstrzymać się od łączenia z lmgtfy, więc oto wyjaśnienie z MySQL: http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html –

+0

@A. Rex - Jestem zły (w pewnym sensie) mój punkt widzenia jest trudny, ale brakuje mi pytania, w jaki sposób wypowiesz dobre pytanie. W związku z tym my (ludzie przepełnieni stosami) nie jesteśmy w stanie zapewnić dobrej odpowiedzi na podstawie niewystarczających informacji. –

Odpowiedz

8

Jak mogę zmodyfikować MySQL, aby to uwzględnić?

Będziesz musiał zmienić koncepcję MySQL, co to jest słowo.

Po pierwsze, domyślna minimalna długość słowa to 4. Oznacza to, że żadne wyszukiwane słowo zawierające tylko słowa o długości < nigdy nie będzie pasować, niezależnie od tego, czy jest to "C++" czy "cpp". Możesz to skonfigurować za pomocą opcji konfiguracyjnej ft_min_word_len, np. w my.cfg:

[mysqld] 
ft_min_word_len=3 

(Potem stop/start Mysqld i przebudować indeksy pełnotekstowe.)

Po drugie, „+” nie jest uważane za pismo przez MySQL. Możesz sprawić, że będzie to litera, ale to oznacza, że ​​nie będziesz w stanie wyszukać słowa "ryba" w łańcuchu "ryba z frytkami", więc trzeba zachować ostrożność. I to nie jest trywialne: wymaga rekompilacji MySQL lub zhakowania istniejącego zestawu znaków. Zobacz rozdział "Jeśli chcesz zmienić zestaw znaków, które są uważane za znaki słowne ..." w section 11.8.6 dokumentu.

uciec znak + podczas procesu wprowadzania moich danych za coś takiego jak „__plus”, a następnie modyfikując moje poszukiwania, aby pomieścić

Tak, coś w tym jest wspólne rozwiązanie: można zachować "prawdziwe" dane (bez ucieczki) w podstawowej, ostatecznej tabeli - zwykle przy użyciu InnoDB dla zgodności z ACID. Następnie można dodać pomocniczą tabelę MyISAM, zawierającą tylko zniekształcone słowa dla przynęty pełnego tekstu. Możesz także wykonać ograniczoną formę wyłudzenia przy użyciu tego podejścia.

Inną możliwością jest wykrywanie wyszukiwań, których MySQL nie może wykonać, takich jak te, które zawierają tylko krótkie słowa lub nietypowe znaki, i powrót do prostego, ale powolnego wyszukiwania LIKE lub REGEXP tylko dla tych wyszukiwań. W tym przypadku prawdopodobnie będziesz chciał również usunąć stoplist, ustawiając ft_stopword_file na pusty ciąg znaków, ponieważ nie jest również praktyczne, aby podnieść wszystko w tym jako specjalne.

+0

@bobince: (Przeczytaj dyskusję w komentarzach powyżej, dziękuję za odpowiedź na to łatwe do zrozumienia pytanie w jasny sposób). ciekawość, jak byś sobie radził z tym podejściem? Zastąpić każde słowo w tabeli pomocniczej trzonem? –

+0

Zasadniczo tak (przetwarzanie słów w zapytaniach w ten sam sposób, oczywiście). Zazwyczaj korzystasz z istniejącej biblioteki suwaków do usuwania suwaków dla swoich preferowanych języków. (Dla obu wartości "języka", zobacz np. Algorytm Portera dla języka angielskiego w wielu językach programowania). – bobince

0

Zwykle znaki z Esc są używane w zapytaniu, a nie w danych bazy danych. Spróbuj odrzucić każde "+" w zapytaniu.

1

Od http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html:

zdanie, które jest zamknięte w podwójny cudzysłów („"”) znaków pasuje tylko wiersze zawierające frazę dosłownie, jak to zostało wpisane

Oznacza to ciebie. może szukać 'C++' za pomocą tej kwerendy:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ('"C++"' IN BOOLEAN MODE) 
0

rozwiązanie ::

zmiana my.ini plik

umieścić te dwa kierunki

ft_min_word_len = "1" 
ft_stopword_file ="" 

poniżej

[mysqld] 

niż savve pliku i restart serwera mysql.

my.ini plik zostanie udostępniony przez wszystkich. więc możemy zrobić zmiany w pliku my.ini tylko dla niektórych sesji?