Python and Redis: A mini search engine

5,727 views
5,787 views

Published on

A mini search engine built with Python using Redis, double metaphone and Levenstein distance

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,727
On SlideShare
0
From Embeds
0
Number of Embeds
2,515
Actions
Shares
0
Downloads
21
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Python and Redis: A mini search engine

    1. 1. Python et NoSQL
    2. 2. Performance etHardware limité
    3. 3. NoSQL Not Only SQL• Plusieurs catégories de databases NoSQL • Document Store (MongoDB) • Graph (Neo4j) • Key-Value Store (Redis, Memcached, Cassandra, BigTable) • ...
    4. 4. Pourquoi NoSQL ?• Performance !!!• Données non structurées• Utilisation sur un hardware aux ressources limitées
    5. 5. Première expérience
    6. 6. MongoDB ? [52541.307871] [<ffffffff810cc981>] ? handle_mm_fault+0x27a/0x80f[52541.307886] [<ffffffff812fe6b6>] ? do_page_fault+0x2e0/0x2fc[52541.307897] [<ffffffff812fc555>] ? page_fault+0x25/0x30[52541.307907] Disabling lock debugging due to kernel taint[52541.307918] BUG: Bad page state in process mongod pfn:3d7c2[52541.307927] page:ffffea0000d73270 flags:0100000000100068 count:1mapcount:1 mapping:ffff88006036e621 index:7f82c1fea[52541.307940] Pid: 1326, comm: mongod Tainted: G B 2.6.32-5-amd64#1[52541.307948] Call Trace:[52541.307959] [<ffffffff810b7a11>] ? bad_page+0x116/0x129[52541.307968] [<ffffffff810b9b2e>] ? get_page_from_freelist+0x4fd/0x760 La VM crash.....[52541.307983] [<ffffffff81153037>] ? cap_file_mprotect+0x0/0x3[52541.307995] [<ffffffff8100e242>] ? check_events+0x12/0x20
    7. 7. Redis, notre sauveur• Key-Value store• Ecrit en C• Très performant• En mémoire• With data structure: • Strings, Hashes, Lists, Sets and Sorted Sets
    8. 8. Ce que nous avons apprisUne BD en mémoire vive ? « J’ai trop de données !!! » L’oeuvre complète de Shakespeare représente 5.5Mb, et compressée 2Mb. NewsInApp.io ➠ 900 Mb réparti sur 3 bases de données Redis.Mythe « La mémoire vive est peu onéreuse » Mais, la quantité de mémoire est le principal critère de coût chez les hébergeurs Amazon EC2: Small Instance = 1.7 Gb, Medium Instance = 3.75... Prgmr: 1 Gb = $192 par an, 2 Gb = $345 et 4 Gb = $652Ne conserver que les données opérationnelles (utilisées) Nous ne conversons les news qu’au maximum 20 jours.
    9. 9. Mini moteur de rechercheDémonstration de l’utilisation de Redis avec Python
    10. 10. Metaphone• Metaphone is a phonetic algorithm, an algorithm for indexing words by their English pronunciation See http://en.wikipedia.org/wiki/Metaphone• The Double Metaphone phonetic encoding algorithm is the second generation of this algorithm• Examples: Python ➠ P0N PTN Pythen ➠ P0N PTN Pithon ➠ P0N PTN Piton ➠ PTN
    11. 11. MetaphonePython implementationhttp://www.atomodo.com/code/double-metaphone/metaphone.py/view
    12. 12. Indexation des topicstopic 3000 topic 1782 topic 1486keywords «Johnny Depp» keywords «John Seymour» keywords «Wino»metaphones des keywords metaphones des keywords metaphones des keywords Johnny ➠ JN, AN John ➠ JN, AN Wino ➠ AN, FN Depp ➠ TP Seymour ➠ SMR topic 1737 keywords «Debbie Macomber» metaphones des keywords Debbie ➠ TP Macomber ➠ MKMPR
    13. 13. Indexation: Metaphone et RedisChaque metaphone est une clé dont la valeur est un SET (liste sans doublons). Ce SET contient tous lestopics utilisant ce metaphoneJN ➠ 3000, 1782 AN ➠ 3000, 1782, 1486 TP ➠ 3000, 1737
    14. 14. Recherche de «Johnny Depp»• Chaque metaphone est une clé dont la valeur est un SET (liste sans doublons). Ce SET contient tous les topics utilisant ce metaphone JN ➠ 3000, 1782 AN ➠ 3000, 1782, 1486 TP ➠ 3000, 1737• Un peu de magie Redis avec la commande SINTER (Intersection de SET) SINTER( JN, AN, TP) ➠ 3000 Intersection de trois listes (sets)
    15. 15. Un exemple de rechercheQue donnerait cette méthode avec le keyword « DEPP » (Metaphone: TP) ? • Debbie Macomber • Johnny Depp • Metaphysia: Earth in Deep Shift • ...
    16. 16. Levenshtein distance• Il s’agit d’une métrique de « distance » entre deux mots. http://en.wikipedia.org/wiki/Levenshtein_distance• Implementation Python: python-Levenshtein
    17. 17. API RESTFul et Django
    18. 18. Gunicorn - Server WSGI Fichier « myconfig » proc_name = "my_process" bind = "unix:/tmp/gunicorn.sock" workers = 5 timeout = 30 preload_app = True daemon = False gunicorn_django --config myconfig
    19. 19. Nginxlocation / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_pass http://unix:/tmp/gunicorn.sock;}
    20. 20. Supervisor[program:api_server]command=/myenv/bin/gunicorn_django --config myen/conf/myconfig.confdirectory=/myenv/mydjangoprojectautostart=trueautorestart=unexpectedenvironment=PYTHONPATH=/myenv/mydjangoprojectenvironment=DJANGO_SETTINGS_MODULE=settings sudo supervisorctl api_server RUNNING pid 999, uptime 26 days, 19:50:29 supervisor> stop api_server supervisor> start api_server
    21. 21. • Redis est ultra performant et simple à maitriser.• Utilisation de Redis avec Python :))))) didier.rano@gmail.com @newsinapp Vous êtes les bienvenus pour l’alpha de NewsInApp.io

    ×