Ale w jaki sposób mogę dopasować TST-DFS, jeśli użytkownik wpisał w TST DFS?
chciałbym że SKU mieć trafności powiedzieć 8, zamiast pełnej 10 ..
Jeśli mam rację pytanie, odpowiedź jest rzeczywiście łatwe.
Cóż, jeśli forge twoje zapytanie trochę przed wysłaniem do mysql.
OK, załóżmy, że mamy $query
i zawiera ona TST-DFS
.
Czy skupimy się na rozpiętości słów? Przypuszczam, że powinniśmy, jak większość wyszukiwarek, więc:
$ok=preg_match_all('#\w+#',$query,$m);
Teraz jeśli wzór dopasowany ... $m[0]
zawiera listę słów w $query
.
Można to dostosować do kodu SKU, ale dopasowanie do pełnych słów w trybie ORAZ jest podobne do tego, co zakłada użytkownik. (Jak to się dzieje na google i yahoo)
Następnie musimy ugotować $expr
wyrażenie zostanie wstrzyknięty do naszego ostatecznego zapytania.
if(!$ok) { // the search string is non-alphanumeric
$expr="false";
} else { // the search contains words that are no in $m[0]
$expr='';
foreach($m[0] as $word) {
if($expr)
$expr.=" AND "; // put an AND inbetween "LIKE" subexpressions
$s_word=addslashes($word); // I put a s_ to remind me the variable
// is safe to include in a SQL statement, that's me
$expr.="word LIKE '%$s_word%'";
}
}
Teraz $expr
powinien wyglądać "words LIKE '%TST%' AND words LIKE '%DFS%'"
z tą wartością, możemy zbudować ostateczną zapytanie:
$s_expr="($expr)";
$s_query=addslashes($query);
$s_fullquery=
"SELECT (Product,word,if((word LIKE '$s_query'),relevancy,relevancy-2) as relevancy) ".
"FROM some_index ".
"WHERE word LIKE '$s_query' OR $s_expr";
który otrzymuje następujące, dla "TST-DFS":
SELECT (Product,word,if((word LIKE 'TST-DFS'),relevancy,relevancy-2) as relevancy)
FROM some_index
WHERE word LIKE 'TST-DFS' OR (word LIKE '%TST%' AND word LIKE '%DFS%')
Jak widać, w pierwszej linii SELECT
, jeśli mecz jest częściowa, będzie mysql powrócić trafności-2
W trzecim klauzula WHERE
, jeśli nie pełny mecz, $s_expr
, częściowe zapytanie mecz gotowane z góry, jest sądzony zamiast.
Nie można użyć 'możliwości FULLTEXT' MySQL, czy to co masz na myśli mówiąc„indeks”? – Bojangles
Problem polega na tym, że mam dużo informacji, które są ważne, ale FULLTEXT MySQL nie wie, że jest ważny (jak numery sku, nazwa produktu i inne określone słowa). Więc indeksuję każde słowo w każdym produkcie i nie wierzę, że FULLTEXT MySQL pomoże mi przeszukać każdy z wierszy. – Ben
O rację. O ile widzę, nie, "FULLTEXT" nie byłoby w ogóle użyteczne. Szkoda naprawdę, ponieważ jest to wspaniała część MySQL. – Bojangles