4 votes

Existe-t-il un moyen de rechercher dans Sphinx les enregistrements dont un champ particulier n'est pas vide ?

J'utilise le mode de correspondance SPH_MATCH_EXTENDED2 avec Sphinx 0.9.9 et je veux écrire une requête de recherche qui trouve tous les enregistrements qui ont quelque chose dans un champ particulier. J'ai essayé ce qui suit, sans succès :

@MyField *
@MyField !""

Je me dis que je peux ajouter un champ à mon index qui vérifie spécifiquement ce point et faire une requête à partir de ce champ, mais je préférerais avoir plus de flexibilité que cela - ce serait vraiment bien de pouvoir le faire par le biais de la syntaxe de requête.

Des idées ?

2voto

Anton Dukhanin Points 21

C'est facile, il suffit d'ajouter une constante dans votre sql_query dans la configuration de sphinx :

sql_query = SELECT `id`, `title`, 1 as `all` FROM table 

alors vous pouvez utiliser simply query for en mode de requête étendue :

@all "1"

et ça marche

1voto

Riedsio Points 4500

Vous pouvez le faire sans mettre à jour/changer la base de données -- juste en modifiant la requête sql_ sur laquelle votre index/source est construit. ex.

 sql_query = SELECT id, \
               IF(title!='',title,'this_field_is_actually_blank') \
             FROM table 

Ensuite, en s'inspirant du commentaire d'un précédent posteur, il suffit d'utiliser la négation dans la requête sphinx.

Vous pouvez également créer un attribut sphinx dynamique sur lequel vous pourrez filtrer.

 sql_query = SELECT id, \
               title,  \
               IF(title!='',1,0) AS title_is_not_blank \
             FROM table 

 sql_attr_uint = title_is_not_blank

Ensuite, assurez-vous de filtrer sur title_is_not_blank=1 pour chaque recherche.

Ou, en fonction de votre application, si vous nunca si vous avez besoin de ceux dont le contenu est vide, il suffit de les éliminer avec la requête sql_query. WHERE clause. Par exemple

 sql_query = SELECT id, \
               title  \
             FROM table 
             WHERE title!=''

0voto

servermanfail Points 1761

Utilisez deux index distincts ; l'un avec toutes les données, l'autre avec seulement les lignes qui ont des données dans cette cellule qui vous intéresse, vous pouvez ensuite spécifier quel index utiliser au moment de la requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X