2012-04-06 9 views
6

Trochę się mylić, próbując skonfigurować wyszukiwanie wykorzystujące wyszukiwanie pełnotekstowe w trybie boolowskim. Oto zapytanie Używam:Wyszukiwanie pełnotekstowe MySQL Tryb logiczny zamieszania

$query = "SELECT *, 

     MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score 

     FROM results 

     WHERE MATCH(title) AGAINST('$q' IN BOOLEAN MODE) 

     ORDER BY score DESC"; 

Kiedy biegnę poszukiwania +divorce+refinance, wyniki zwracane są:

1) Divorce: Paying Off Spouse = Rate/Term Refinance 
2) Divorce - What to Look Out For Regarding Divorced Borrowers 

mam rację sądząc, że drugi wynik nie powinny być wyświetlane, ponieważ nie ma obu słów? Jeśli nie, w jaki sposób mogę utworzyć tę funkcjonalność?

Odpowiedz

9

Może się mylę, ale jeśli przeszukasz ten ciąg +divorce+refinance, uzyskasz dziwny wynik. Jeśli chcesz wyszukać oba słowa, należy wyszukać +divorce +refinance (z odstępem między).

Przetestowałem go i zwraca tylko jeden wiersz:

Divorce: Paying Off Spouse = Rate/Term Refinance 
4

Twój problem dotyczy utworzenia priorytet zapytanie logiczną i dla tego typu jedno zapytanie musi iść w głębi wyszukiwania Boolean i teraz jak Wyszukiwanie Boolean jest wykonywane. W prostych słowach pozwól mi wyjaśnić, dlaczego pokazano drugi wynik wyniku.

Kiedy należy najpierw zrozumieć, co znaczy Boolean w programowaniu? Oznacza to, że albo warunek jest prawdziwy, albo fałszywy, e 0 do 1.

Pozwolę sobie teraz wyjaśnić, że przeprowadzane jest wyszukiwanie Boole'a? Dałeś dwa słowa. Przeszukuj wiersz po wierszu w trybie Boolean. Wyszukiwarka uruchamia się i przeszukuje wiersz po wierszu, gdzie znajduje się pierwsze słowo, czyni rekord jako prawdziwy i podaje wynik jako 1 do wierszy, w których znajduje się pierwsze słowo, a także przygotowuje liczby słów znalezionych w wierszu.

Teraz przesuwa następne słowo i robi ten sam proces, który daje rekord True i tworzy listę rekordów, gdziekolwiek znajduje się słowo, a także przygotowuje liczbę słów znalezionych w rzędzie.

Teraz dostępne są dwa rzędy wyników, które są uderzane pałkami, a pierwszeństwo mają słowa z maksymalną liczbą słów i wierszy. Oto główny problem.

Przykład

pierwsze >>> całkowite nr. >> Drugi >> suma nos. >>> końcowe >> wiersz
Słowo >>> Wyniki >> Słowo >>>> słów>>> Wyniki >> nie >> Odpowiedź


1 >>>>>>>> 2 >>>>>>>> 1 >>>>>>>>> 1 >>>>>>>> 1.33 >>>> 1 >>> 1.33
0 >>>>>>>> 0> >>>>>>> 2 >>>>>>>>> 2 >>>>>>>> 1,25 >>>> 2 >>> 1,25
0 >>>>>>>> 0 >> >>>>>> 1 >>>>>>>>> 0 >>>>>>>> 1,25 >>>> 3 >>> 1

podczas clubbing dwie listy wyników podczas prawda dodany z wartością false wynik jest prawdziwy, tak jakby dodać 1 + 0 = 1, a wyniki są shoul d o wartości większej niż 1. Tak więc, podczas oceniania trafności względem znalezionych słów, zawsze okazuje się, że wyszukiwarka pokazuje wyniki, w których znalazło jakieś słowo.

Zapytania dotyczące trafności punktowania są dokonywane w dwóch typach albo ignorują wyniki, które są równe jeden, i tylko wykonują obliczenia na rekordach, których wynik jest większy niż 1. Drugim jest utworzenie takiego zapytania, aby nigdy nie było rekordów równych jeden. Jak w twoim przypadku można więc poniższe rzeczy również uzyskać poprawne wyniki dla dwóch słowach:

SELECT *, ((1.3 * (MATCH(title) AGAINST ('+term +term2' IN BOOLEAN MODE))) + (0.6 * (MATCH(text) AGAINST ('+term +term2' IN BOOLEAN MODE)))) AS score FROM results WHERE (MATCH(title, text) AGAINST ('+term +term2' IN BOOLEAN MODE)) HAVING relevance > 0 ORDER BY relevance DESC; 

wiem, że przy użyciu wyraz mający dokonać kwerendy trochę powolna, ale nie ma innego rozwiązania dostępne. Mam nadzieję, że to rozwiąże twoje zapytanie.

Powiązane problemy