Maison  >  Article  >  base de données  >  Comment Redis implémente la fonction de recherche distribuée

Comment Redis implémente la fonction de recherche distribuée

PHPz
PHPzoriginal
2023-11-08 11:18:171179parcourir

Comment Redis implémente la fonction de recherche distribuée

Redis est une base de données NoSQL hautes performances qui fournit une multitude de fonctions et de structures de données, notamment des chaînes, des tables de hachage, des listes, des ensembles, des ensembles ordonnés, etc. De plus, Redis fournit également certaines fonctions avancées, telles que la publication et l'abonnement, les scripts Lua et les transactions. Parmi eux, la fonction de recherche distribuée de Redis est très pratique et peut nous aider à récupérer rapidement de grandes quantités de données. Dans cet article, nous explorerons comment Redis implémente les fonctions de recherche distribuée et donnerons des exemples de code spécifiques.

1. Présentation de la fonction de recherche distribuée de Redis

Redis fournit deux fonctions de recherche distribuée : la recherche en texte intégral et l'analyse basée sur des attributs spécifiques. Nous examinons ici d’abord les concepts et les méthodes de mise en œuvre de ces deux fonctions.

1. Recherche en texte intégral

La recherche en texte intégral fait référence à la recherche d'une chaîne spécifique dans des données texte. Dans Redis, nous pouvons utiliser le plug-in Redisearch pour implémenter la fonctionnalité de recherche en texte intégral. Redisearch utilise un index inversé pour mettre en œuvre la recherche, c'est-à-dire qu'il divise d'abord chaque document en termes, puis établit une relation de mappage entre chaque terme et le numéro du document, et enfin crée une table d'index inversé pour tous les termes. Lors de la recherche, il vous suffit de rechercher le terme à interroger dans la table d'index inversé.

Redisearch prend en charge la recherche générique et floue lors de la recherche, et prend également en charge les opérations logiques telles que « ET » et « OU ». Les résultats de la recherche peuvent être triés selon certaines règles, ou vous pouvez spécifier que seule une partie des résultats sera renvoyée.

2. Analyse basée sur les attributs

L'analyse basée sur les attributs fait référence au filtrage des données qui remplissent les conditions en fonction d'un ou plusieurs attributs dans une collection de données avec plusieurs attributs. Dans Redis, nous pouvons utiliser RedisGears et Redisearch pour réaliser cette fonction.

RedisGears est un plug-in maintenu par Redis, qui fournit la fonction de convertir les paires clé-valeur Redis en flux. Nous pouvons également utiliser RedisGears pour créer des flux, puis utiliser la commande "FT.AGGREGATE" de Redisearch pour agréger ces flux. Après l'agrégation, les données peuvent être filtrées et triées, et peuvent également être sorties vers d'autres structures de données dans Redis ou envoyées sur le réseau.

2. Implémentation spécifique de la fonction de recherche distribuée de Redis

Ici, nous prenons la recherche en texte intégral comme exemple pour implémenter la fonction de recherche distribuée. Nous utiliserons redisearch-py comme client Python et simulerons une instance Redis sur deux nœuds. Dans cet exemple, nous allons créer un index dans chacune des deux instances Redis et effectuer une recherche.

1. Installer les dépendances

Installez la bibliothèque redisearch-py :

pip install redisearch

2. Construisez une instance Redis

Tout d'abord, nous devons démarrer deux instances Redis sur deux ports différents. Ici, nous utilisons l'image officielle de Redis et créons deux instances en modifiant les paramètres du port.

$ docker run -d -p 6380:6379 redis
$ docker run -d -p 6381:6379 redis --port 6379

3 Créer un index

Utilisez l'objet RediSearch dans redisearch-py (redisearch-py Main interface) crée deux index de texte intégral. Ici, nous avons utilisé la commande "FT.CREATE".

à partir de l'importation de redisearch Client, Query, TextField, NumericField
client1 = Client('index1', port=6380)
client2 = Client('index2', port=6381)

client1.create_index((TextField('title' ,weight=5.0), TextField('content')))
client2.create_index((TextField('title',weight=5.0), TextField('content')))

Ici, nous définissons deux champs, ce sont le titre et le contenu respectivement. Parmi eux, le poids du titre est de 5,0 et le poids du contenu est la valeur par défaut de 1,0, ce qui indique que le titre est plus important. Nous pouvons utiliser ces deux champs pour faire correspondre les requêtes de recherche.

4. Ajouter des données

Ajoutez des données aux deux index pour faciliter les opérations de recherche ultérieures. Ici, nous utilisons simplement la commande "FT.ADD" pour ajouter des données.

client1.redis.execute_command('FT.ADD', 'idx1', 'doc1', 1.0, 'FIELDS', 'title', 'this est un titre', 'content', 'voici du contenu')
client1.redis.execute_command('FT.ADD', 'idx1', 'doc2', 1.0, 'FIELDS', 'title', 'title is important', 'content', 'content n'est pas si important')

client2.redis.execute_command('FT.ADD', 'idx2', 'doc1', 1.0, 'FIELDS', 'title', 'this est un titre', 'content', 'voici du contenu')
client2.redis.execute_command('FT.ADD', 'idx2', 'doc2', 1.0, 'FIELDS', 'title', 'le titre est important', 'contenu', 'le contenu n'est pas si important')

Ici, nous avons ajouté deux documents, chaque document comporte deux champs, titre et contenu.

5. Rechercher des données

Utilisez l'objet RediSearch pour exécuter les commandes de recherche. Ici, nous utilisons la commande "FT.SEARCH" pour rechercher et spécifier la chaîne de requête et l'index à rechercher.

result1 = client1.search('content')
result2 = client2.search('content')

Vous pouvez voir que les deux ensembles de résultats proviennent de deux index différents.

6. Afficher les résultats

Enfin, nous utilisons la bibliothèque pprint en Python pour imprimer les résultats :

from pprint import pprint
pprint(result1)
pprint(result2)

Les résultats en cours d'exécution sont les suivants :

{'docs' : [{'content' : 'voici du contenu', 'title' : ' ceci est un titre', 'id' : 'doc1'}], 'total_results' : 1, 'cursor' : 0, 'total_pages' : 1}
{'docs' : [{'content' : 'voici du contenu', 'title' : ' ceci est un titre', 'id' : 'doc1'}], 'total_results ' : 1, 'cursor' : 0, 'total_pages' : 1}

Nous pouvons voir que les deux résultats de recherche incluent des documents avec "voici du contenu".

3. Résumé

Dans cet article, nous avons présenté la fonction de recherche distribuée Redis et donné un exemple de code pour la recherche en texte intégral. Lors de la mise en œuvre de la recherche distribuée, nous devons utiliser deux plug-ins, Redisearch et RedisGears, et effectuer la configuration du cluster sur Redis.

La fonction de recherche distribuée de Redis nous aide non seulement à récupérer rapidement de grandes quantités de données, mais évite également les points de défaillance uniques et améliore la disponibilité du système. Nous pensons qu'en étudiant cet article, vous aurez une compréhension plus approfondie de la fonction de recherche distribuée de Redis.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn