2017-09-14 3 views
0


Cela peut sembler être une question redondante, mais je ne trouve pas la bonne réponse à ce problème.
J'ai une tableA avec plus de 50 colonnes. J'implémente une fonctionnalité de recherche pour rechercher une requête dans environ 10 colonnes de cette table. La TableA contient plus d'un million de lignes
Pour cela, j'ai créé un index composite sur ces 10 colonnes.
index (col1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10)
Maintenant, je divise la requête de l'utilisateur en utilisant l'espace comme regex. c'est-à-dire
$search_words = $search_query.split(' ');
et en utilisant des mots individuels pour faire correspondre dans ma requête de recherche. Exemple:
Optimisation de la requête de recherche

SELECT something FROM tableA 
WHERE (MATCH (col_1, col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10) 
AGAINST (' +word1* +word2* +word3* +word4* ' IN BOOLEAN MODE)) 

Cette requête fonctionne très bien pour les recherches générales, mais si les utilisateurs des recherches pour les alphabets individuels dans la requête comme A E I O Co. il prend trop de temps. Quel est le meilleur moyen d'optimiser la requête ou une autre façon d'effectuer une recherche dans cette situation?

+0

E.g. Ne les laissez pas rechercher des caractères uniques pour la recherche fulltext myisam. Ajustez 'ft_min_word_len' à 2 pour qu'il effectue une meilleure recherche de texte intégral. Si vous avez vraiment besoin de cela, vous devriez envisager d'utiliser un moteur de recherche tel que 'sphinxse' ou' elasticsearch.'. Mysql ne peut pas gérer très bien. – abeyaz

+0

faire le minimum de symboles dans le code. pourquoi ne pas vous diviser des données à l'autre table. est vraiment nécessaire de tenir tout cela dans beaucoup de colonnes. Je créerais table avec 3 colonnes id, pointer_to_item_or_product, search_word sont u besoin somekind de la séquence dans la recherche? –

+0

@abeyaz ne peut pas restreindre la recherche car il peut être une recherche valide et ne suis pas autorisé à utiliser un moteur de recherche tel que lucene, elasticsearch, etc., car il sera implémenté après un certain temps. Mais jusqu'à ce que cela doit améliorer cette fonctionnalité. – Gaur93

Répondre

0

Si vous introduisez une chaîne trop courte dans FULLTEXT d'InnoDB, elle renvoie zéro résultat. Donc ... Filtrer toutes les chaînes qui sont plus courtes que innodb_ft_min_token_size.

Si nécessaire, testez-les séparément en utilisant REGEXP '[[:<:]]A[[:>:]] pour rechercher un mot de 1 lettre A.

Ou les jeter ensemble. Cela vérifierait les seuls mots anglais en 1 lettre: REGEXP '[[:<:]][AI][[:>:]]