2015-01-14 20 views
6

Więc zostały czytanie poniżej:MySQL Ranking trafności wyszukiwania niektóre kolumny wyższe

How can I manipulate MySQL fulltext search relevance to make one field more 'valuable' than another?

byłem zainteresowany w poniższej reakcji i starał się wdrożyć to z sukcesem.

SELECT url, keywords, title, 
    MATCH (keywords) AGAINST ('green watermelon') AS rel1, 
    MATCH (title) AGAINST ('green watermelon') AS rel2 
FROM straight 
WHERE MATCH (keywords,title) AGAINST ('green watermelon') 
ORDER BY (rel1)+(rel2*1.5) 

Mój jedyny problem jest następujący.

Jeśli użytkownik jest poszukiwanie powiedzieć „Green arbuza”, który odpowiada 3 rzędy w tabeli z 2 kolumny, jak poniżej:

 
+------------+------------+ 
| Keyword | Title  | 
+------------+------------+ 
| Green  | Green  | 
| Green  | Watermelon | 
| Watermelon | Watermelon | 
+------------+------------+ 

Chciałbym drugi rekord należy „Ranking” najpierw jako jej jest najbardziej trafny, ale wszystkie mają taką samą trafność dla wyszukiwanego hasła "Zielony arbuz", ponieważ "Zielony" jest używany dwa razy w obrębie słowa kluczowego i tytułu.

Najlepszym sposobem, jak sądzę, że można to rozwiązać, jest znalezienie zielonego słowa, gdy zwiększy ono trafność, powiedzmy 1, a kiedy indziej zobaczy słowo zielone, zwiększy je o 0, a jeśli zobaczy arbuza, podobnie. To dałoby drugi wynik, a ocena trafności 2, a pozostałe 2 rzędy - trafność równą 1. W związku z tym powinno być ono bardziej odpowiednie, jak powinno być. To będzie działać dla dłuższych terminów wyszukiwania podczas wyszukiwania w większej bazie danych.

EDIT:

Jeśli to możliwe mogę utworzyć kolejną kolumnę, która ma zarówno tytuł i słowa kluczowe, więc powiedzieć, że kolumna jest nazywany „mashup” tabela będzie wyglądać bardziej jak:

 
+------------+------------+-----------------------+ 
| Keyword | Title  | Mashup    | 
+------------+------------+-----------------------+ 
| Green  | Green  | Green Green   | 
| Green  | Watermelon | Green Watermelon  | 
| Watermelon | Watermelon | Watermelon Watermelon | 
+------------+------------+-----------------------+ 

Wtedy „jeśli to możliwe” my musiałaby de dupe pola więc skończyć jak:

 
+------------+------------+-----------------------+ 
| Keyword | Title  | Mashup    | 
+------------+------------+-----------------------+ 
| Green  | Green  | Green     | 
| Green  | Watermelon | Green Watermelon  | 
| Watermelon | Watermelon | Watermelon   | 
+------------+------------+-----------------------+ 

Następnie wyszukiwanie będzie działać zgodnie z przeznaczeniem z doskonałymi wynikami trafności.

góry dzięki

+1

Można ustawić do sqlfiddle? – Mihai

+0

@Mihai Przepraszam, że nigdy wcześniej tego nie robiłem, czy to pozwoli ci spojrzeć na to, czego szukasz? – BubblewrapBeast

+1

tak, chcę trochę się z tym bawić, gdybym wiedział dokładnie, co było, co dałbym odpowiedź. Wystarczy stół z kilkoma rzędami. – Mihai

Odpowiedz

0

Wystarczy tylko określić ważniejszą kolumnę w pierwszej pozycji swojej MATCH()

SELECT url, keywords, title 
     FROM straight 
     WHERE MATCH(title, keywords) AGAINST('green watermelon') 
     ORDER BY MATCH(title, keywords) AGAINST('green watermelon') DESC; 

+------+------------+------------+ 
| id | keywords | title  | 
+------+------------+------------+ 
| 2 | Green  | Watermelon | 
| 3 | Watermelon | Green  | 
| 1 | Green  | Green  | 
+------+------------+------------+ 
Powiązane problemy