2 votes

Une limitation de la recherche plein texte de Sqlite3 ne permet pas les OU avec les MATCHs. Solution ?

La fonction de recherche en texte intégral de Sqlite3 - FTS3 - permet d'utiliser l'opérateur MATCH pour une recherche rapide en texte intégral :

SELECT ItemId FROM docs WHERE docs.text MATCH 'linux'

Cependant, il ne supporte pas l'opérateur OR n'importe où dans une requête SQL où il y a un MATCH (source : 1 , 2 ):

SELECT ItemId FROM docs WHERE docs.text MATCH 'linux' OR column=value
error: unable to use function MATCH in the requested context

(A ne pas confondre avec l'opérateur OR dans la requête FTS3 elle-même, c'est à dire SELECT ItemId FROM docs WHERE docs.text MATCH 'linux OR unix' . Cela fonctionne bien).

Existe-t-il un moyen de réécrire la requête pour qu'elle fonctionne (même si elle est un peu plus lente) ?

2voto

user38329 Points 328

La réécriture de la requête en utilisant des vues temporaires fonctionnera comme prévu :

CREATE TEMP VIEW view1 AS SELECT ItemId FROM docs WHERE docs.text MATCH 'linux' 
SELECT * FROM docs WHERE ItemId IN view1 OR column=value
DROP VIEW view1

La vitesse sera comparable à celle d'une requête "directe" (sans la vue temporaire) si la vue temporaire n'est pas "balayante", c'est-à-dire qu'elle ne génère pas beaucoup de lignes.

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