Comment permettre à la recherche en texte intégral avec des traits d'union dans la requête de recherche
J'ai des mots-clés comme "un-ou-autres" où les traits d'union de la matière dans la recherche par le biais de ma base de données mysql. Je suis actuellement en utilisant le texte complet de la fonction.
Est-il un moyen d'échapper le caractère de trait d'union?
Je sais qu'une option est de les commenter #define HYPHEN_IS_DELIM
dans le myisam/ftdefs.h fichier, mais malheureusement, mon hôte ne le permet pas. Est-il une autre option?
Modifier 3-8-11
Voici le code que j'ai droit:
$search_input = $_GET['search_input'];
$keyword_safe = mysql_real_escape_string($search_input);
$keyword_safe_fix = "*'\"" . $keyword_safe . "\"'*";
$sql = "
SELECT *,
MATCH(coln1, coln2, coln3) AGAINST('$keyword_safe_fix') AS score
FROM table_name
WHERE MATCH(coln1, coln2, coln3) AGAINST('$keyword_safe_fix')
ORDER BY score DESC
";
OriginalL'auteur Jay | 2011-03-04
Vous devez vous connecter pour publier un commentaire.
À partir d'ici http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
Une solution pour trouver un mot avec des tirets ou des traits d'union dans l'est de l'utilisation de la RECHERCHE PLEIN TEXTE EN MODE BOOLÉEN, et de mettre le mot avec le trait d'union /tableau de bord dans des guillemets doubles.
Ou à partir d'ici http://bugs.mysql.com/bug.php?id=2095
Il y a une autre solution. Il a été récemment ajouté au manuel:
"
Modifier le jeu de caractères du fichier: Cela ne nécessite aucune recompilation. Le true_word_char() macro
utilise un “caractère de type” tableau de distinguer les lettres et les chiffres des autres
des personnages. . Vous pouvez modifier le contenu de l'un des jeu de caractères XML
les fichiers de préciser que le " - " est une “lettre”. Ensuite, utilisez le jeu de caractères donné pour votre
FULLTEXT index.
"
Ne l'ai pas essayé sur mon propre.
Edit: Voici quelques autres informations supplémentaires à partir d'ici http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html
Une phrase qui est enfermé à l'intérieur de guillemets doubles (“"”) caractères correspond uniquement les lignes qui contiennent l'expression littéralement, comme il a été tapé. Le moteur de texte intégral divise le membre de phrase en mots et effectue une recherche dans l'index de texte intégral pour les mots. Avant MySQL 5.0.3, le moteur a effectué une sous-chaîne de recherche pour l'expression dans les dossiers qui ont été trouvés, de sorte que le match doit inclure des caractères non-mot dans la phrase. Depuis MySQL 5.0.3, caractères non-mot n'a pas besoin d'être adapté avec précision: recherche de Phrase exige seulement que les matchs de contenir exactement les mêmes mots que la phrase et dans le même ordre. Par exemple, "le test de la phrase" correspond à "tester, le membre de phrase" dans MySQL 5.0.3, mais pas avant.
Si la phrase ne contient pas de mots qui se trouvent dans l'index, le résultat est vide. Par exemple, si tous les mots sont des mots-stop ou inférieure à la longueur minimale des mots, le résultat est vide.
Bien sûr, essayer que SELECT * from your_table_name OÙ MATCH (your_table_column_name) CONTRE ('"SQL-MySQL"' IN BOOLEAN MODE); Vérifier ici pour moore info dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html
FANTASTIQUE!!!!! A travaillé comme un charme! Merci beaucoup 🙂
Zhelev en Fait...j'ai juste fait quelques tests, et a remarqué que les recherches pour les "bla - bla" ou "bla-bla-" (généralement de 2 tirets) tourne jusqu'à 0 résultats. Une idée de comment contourner cela?
Zhelev: Le "score" partie se réfère à la fulltext fonction de la capacité d'évaluer la pertinence de chaque ligne dans la table contre les mots-clés recherchés. Selon la documentation pour la recherche en texte intégral, EN MODE BOOLÉEN ne semble pas permettre cela...je me demandais si il existe un moyen de code d'une fonction de score EN MODE BOOLÉEN, tout en permettant des traits d'union dans la requête de recherche?
OriginalL'auteur Yasen Zhelev
Peut-être plus simple d'utiliser la
Binary
de l'opérateur.http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#operator_binary
La
BINARY
opérateur jette la chaîne suivante à une chaîne binaire. C'est un moyen facile de forcer une colonne de comparaison à faire octet par octet plutôt que caractère par caractère. Cela provoque la comparaison sensible à la casse, même si la colonne n'est pas défini commeBINARY
ouBLOB
.BINARY
provoque également des espaces importants.OriginalL'auteur Hutcho
Certaines personnes suggèrent d'utiliser la requête suivante:
Mais que vous avez besoin de nombreuses variantes selon la utilisée fulltext opérateurs. Tâche: Réaliser une requête comme
+well-known +(>35-hour <39-hour) working week*
. Trop complexe!Et ne pas oublier la valeur par défaut len de
ft_min_word_len
donc une recherche pourup-to-date
renvoie uniquementdate
dans vos résultats.Truc
Parce que je préfère un truc tellement constructions avec
HAVING
etc ne sont pas nécessaires à tous:Au lieu d'ajouter le texte suivant à votre table de base de données:
copiez le trait d'union des mots sans hypens à la fin du texte à l'intérieur d'un commentaire:
Si les recherches d'utilisateurs pour
up-to-date
supprimer le trait d'union dans la requête sql:MATCH(text) AGAINST('uptodate ' IN BOOLEAN MODE)
Par ce que vous êtes utilisateur peut trouver
up-to-date
en un seul mot, au lieu d'obtenir tous les résultats qui contiennent uniquementdate
(parce queft_min_word_len
tueup
etto
).Bien sûr, avant de vous
echo
les textes, vous devez supprimer le<!-- ... -->
commentaires.Avantages
-well-known +science
MySQL considère commenot include *well*, could include *known* and must include *science*
. Ce n'est pas ce que l'utilisateur attend. Le truc résout que, trop (comme la requête sql recherches pour-wellknown +science
)OriginalL'auteur mgutt
Ce qui pourrait sembler hors, mais après avoir lutté avec pendant un certain temps, j'ai réalisé que j'obtenir les résultats que je souhaite en supprimant le trait d'union à partir de l'expression de recherche. Par exemple, si je recherche pour des mots séparés'
retourne les instances du mot "séparé", au besoin. Cela revient aussi autres instances séparées et la parole, mais en y ajoutant le
+
opérateur à chaque mot atteint le trait d'union de la recherche.OriginalL'auteur Félix Gagnon-Grenier