2012-10-01 12 views
9

Buduję wyszukiwanie strony, która wykorzystuje wyszukiwanie pełnotekstowe. Samo wyszukiwanie działa świetnie, to nie mój problem. Łączę słowa dostarczone przez użytkownika (MATCH ... AGAINST ...) z AND, aby wiele słów dalej zawęziło wyniki. Teraz wiem, że niektóre słowa kończące się nie są indeksowane, i to w porządku, nie chcę ich używać jako kryteriów wyboru. Jeśli jednak w zestawie słów kluczowych (przez użytkownika) zostanie podane hasło, zabije ono wszystkie wyniki (zgodnie z oczekiwaniami), nawet jeśli słowo faktycznie znajduje się w określonym bloku tekstowym.ignorowanie mysql fulltext stopwords w zapytaniu

Moje pytanie: czy istnieje sposób sprawdzenia, czy określone słowo jest słowem kończącym w momencie zapytania? Moim preferowanym rozwiązaniem byłoby po prostu wykluczyć odpowiednie słowo z kryteriów wyszukiwania (nie obchodzi mnie, czy użytkownik może zawęzić wyniki słowem "nie", po prostu nie chcę, aby MySQL zwrócił pusty zestaw wyników, ponieważ użytkownik pod warunkiem, że nie ma ich w wynikach). Czy po prostu będę musiał opróżnić listę stopów? Dziękuję bardzo za pomoc.

edytuj ---- Przykro mi, ale tak naprawdę nie ma tu fragmentów kodu, które można by w nim umieścić. Kod działa dobrze, właściwie dokładnie tak, jak powinien. Jest to bardziej logiczny problem, z którym mam do czynienia. Ale jako przykład, w drodze wyjaśnienia:

powiedzmy istnieją trzy rekordy, które zawierają słowa (ale nie wyłącznie)

1: jabłko, pomarańcza, mango, bananów 2: winogrono , pomarańczowy, ananas, mango 3: ziemniak, mango, melon, keira knightly

Jeśli wyszukiwanym słowem wprowadzonym przez użytkownika jest mango, wszystkie wyniki są zwracane poprawnie. Jeśli słowa są pomarańczowe I mango, wyniki 1 i 2 są zwracane (poprawnie). Teraz powiedzmy, że banan jest słowem kończącym (nie jest ... ale załóżmy, że tak jest), jeśli wyszukiwanie dotyczy pomarańczy, mango i banana, żadne wyniki nie są zwracane (ponieważ banan nie znajduje się w indeksie pełnotekstowym).

To, czego szukam, to to, czy ktoś inny napotkał ten problem i ma sposób obejścia go. Rodzaj an:

if 'banana' NOT STOP WORD match 'banana' against `words`. (OBVIOUSLY not real code). 

... Albo ja po prostu będzie musiał upuścić listę stopword ...

+0

co spróbowałeś? czy możesz podać nam przykład? – jcho360

+0

Wygląda na to, że żadna z odpowiedzi nie dostarczyła tego, czego szukałeś. Zawsze można napisać kod aplikacji, aby ręcznie odfiltrować wszelkie hasła (jak również zbyt krótkie słowa) z zapytania. To prawdopodobnie zrobimy. –

+0

2017 i ten sam problem tutaj. Wygląda na to, że pełne wyszukiwanie w mysql jest naprawdę kiepskie i brakuje podstawowych funkcji. – jgr

Odpowiedz

9

Można zweryfikować porównując wszystkie słowa kluczowe stopwords. Oto lista stopwords znalazłem rozwiązanie, aby wyłączyć stopwords z fulltext. Wystarczy zlokalizować .cnf plik i dodać to,

ft_stopword_file = "" 

restartu silnika MySQL i odbudować indeksy;

Nadzieja ta praca

+0

Myślałem, że to może być droga, z którą muszę się udać. Miałem tylko nadzieję, że ktoś inny ma bardziej sprytne rozwiązanie. Dzięki za wkład. – dgeare

+0

Cieszę się, że to działa dla ciebie :) –

3

Jak wyłączyć Fulltext stopwords w MySQL:

W my.ini pliku tekstowego (MySQL):

ft_stopword_file = "" or link an empty file "empty_stopwords.txt" 
ft_min_word_len = 2 

// ustawić minimalną długość, ale należy pamiętać, te krótsze wyrazy (3,2) znacznie wydłużą czas zapytania, zwłaszcza gdy pełne kolumny indeksowanych pełnotekstów są duże.

Zapisz plik, zrestartuj serwer.

Następnym krokiem powinno być naprawić indeksy z tego zapytania:

REPAIR TABLE tbl_name QUICK. 

Jednak to nie będzie działać, jeśli stół jest za pomocą silnika składowania InnoDB. Trzeba będzie go zmienić na MyISAM:

ALTER TABLE t1 ENGINE = MyISAM; 

Więc jeszcze raz:

1. Edit my.ini file and save 
2. Restart your server (this cannot be done dynamically) 
3. Change the table engine (if needed) ALTER TABLE tbl_name ENGINE = MyISAM; 
4. Perform repair      REPAIR TABLE tbl_name QUICK. 

Należy pamiętać, że InnoDB oraz MyISAM mają swoje różnice prędkości. Jeden czytać szybciej, inne zapisy szybciej (czytaj więcej na ten temat w internecie)

+1

Należy zauważyć, że InnoDB od MySQL 5.6 ma indeksy pełnotekstowe –

1

wyłączyć stopword do pełnotekstowego wyszukiwania w MySQL za pomocą tego kroki

1: Otwórz plik my.ini w mysql

2: miejsce poniżej dwóch linii po [mysqld] linii w my.ini (wyszukiwanie [mysqld] w pliku)

ft_min_word_len=1 
ft_stopword_file="" 

3: zrestartować serwer

4: naprawić tabeli przy użyciu poniżej polecenia

> repair table tablename; 

5: teraz wyszukiwanie działa ....

0

spróbować użyć MATCH ... przeciwko ... IN BOOLEAN TRYBIE jak ten: WHERE MATCH (autor, tytuł) przeciw (” "origin of" 'IN BOOLEAN MODE);

+0

stop słowa nie są w pełnotekstowych indeksach, więc nawet jeśli używasz trybu logicznego, to nie wróci byle co –

0

ustawienie ft_stopword_file = ""
nie działa dla mnie, używam tabel InnoDB i MySQL 5.6 (przystanek słowa jeszcze nie indeksowane w pełnych indeksów tekstowych po optymalizację powiązanych tabela)

to rozwiązanie działa (nawet jeśli nie są super user):

CREATE TABLE mydb.stopwordslist(value VARCHAR(20)) ENGINE = INNODB; 
INSERT INTO mydb.stopwordslist(value) VALUES ('skipthisword'); 

dla wszystkich użytkowników, ale nadal trzeba Super uprawnienia użytkownika:

SET GLOBAL innodb_ft_server_stopword_table = 'mydb/stopwordslist'; 

tylko dla użytkownika (zakładając, że ten, kto odtworzenie indeksów i aktualizowanie kolumny)

SET SESSION innodb_ft_user_stopword_table = 'mydb/stopwordslist'; 

ponieważ jest to zmienna sesja, to nie potrwa, gdy sesja jest zamknięta, więc upewnij się ustawić go na każdej sesji lub przed optymalizacją lub wstawieniem do tabel posiadających indeks pełnotekstowy lub podczas aktualizacji kolumny indeksowanej pełnotekstowym indeksem

Powiązane problemy