{"action":"created","issue":{"url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4096","repository_url":"https://api.github.com/repos/zestedesavoir/zds-site","labels_url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4096/labels{/name}","comments_url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4096/comments","events_url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4096/events","html_url":"https://github.com/zestedesavoir/zds-site/pull/4096","id":197463364,"number":4096,"title":"Recherche via Elasticsearch","user":{"login":"pierre-24","id":7889675,"avatar_url":"https://avatars.githubusercontent.com/u/7889675?v=3","gravatar_id":"","url":"https://api.github.com/users/pierre-24","html_url":"https://github.com/pierre-24","followers_url":"https://api.github.com/users/pierre-24/followers","following_url":"https://api.github.com/users/pierre-24/following{/other_user}","gists_url":"https://api.github.com/users/pierre-24/gists{/gist_id}","starred_url":"https://api.github.com/users/pierre-24/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pierre-24/subscriptions","organizations_url":"https://api.github.com/users/pierre-24/orgs","repos_url":"https://api.github.com/users/pierre-24/repos","events_url":"https://api.github.com/users/pierre-24/events{/privacy}","received_events_url":"https://api.github.com/users/pierre-24/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":16,"created_at":"2016-12-24T13:40:08Z","updated_at":"2016-12-27T20:24:14Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/zestedesavoir/zds-site/pulls/4096","html_url":"https://github.com/zestedesavoir/zds-site/pull/4096","diff_url":"https://github.com/zestedesavoir/zds-site/pull/4096.diff","patch_url":"https://github.com/zestedesavoir/zds-site/pull/4096.patch"},"body":"| Q                                   | R\r\n| ----------------------------------- | -------------------------------------------\r\n| Type de modification                | évolution\r\n| Ticket(s) (_issue(s)_) concerné(s)  | #3833 #3748 #3725 #3678  #3625 #3549 #3386 #3393 #3310 #2769 \r\n\r\n**Joyeux noël, zeste de savoir !** Ça fait 2 mois que je me suis proposé, mais cette fois-ci, c'est officiel, je m'y attaque. But du jeu : virer Solr et utiliser elasticsearch !\r\n\r\n### Pourquoi ?\r\n\r\n+ Possibilité de booster des champs ou des types de document ;\r\n+ Possibilité d'utiliser des `analyzer` et des `tokenizer` particulièrement puissants ;\r\n+ Possibilité d'indexer facilement des classes qui ne sont pas de Django\r\n+ (...)\r\n\r\n### Comment ?\r\n\r\n+ En virant solr et haystack, et en se basant directement sur les API's [\"bas niveau\"](https://github.com/elastic/elasticsearch-py) et [\"plus haut niveau\"](https://github.com/elastic/elasticsearch-dsl-py) directement écrites en python et maintenues par l'équipe d'elastic *itself* (ce qui évite d'avoir à attendre la mise à jour, puisque l'API est mise à niveau en même temps que le produit) ;\r\n+ Avec une classe abstraite et des méthodes à surclasser\r\n+ En tapant les différents types dans le même *index* d'elastisearch (les différents modèles étant différenciés par leur *type*) afin de pouvoir facilement faire des recherches sur tout les modèles en même temps (même si elastic permet de la recherche multiindex).\r\n+ En implémentant un mécanisme pour ne réindexer que ce qui est vraiment nécessaire (donc juste les données qui ont changé).\r\n+ En tentant d'éviter un maximum les allez-retour entre BDD \"traditionnelle\" et elastic, au niveau de l'indexation et au niveau de la recherche elle-même (dans l'idéal, la recherche ne devrait faire aucun appel à la BDD, juste à elastic, quitte à stocker des infos supplémentaires dans elastic avec `index=\"not_analyzed\"`).\r\n+ En indexant enfin de manière correcte les contenus, sans devoir repasser par la BDD.\r\n\r\nJe tiens à créditer le package [django-el](https://github.com/asyncee/django-el) pour certaines des idées et manières de faire.\r\n\r\n### TODO\r\n\r\nPour le moment, j'ai fait comme avec la ZEP-12, je travaille sur `zds/search2/` pour éviter les *rebases* trop chiants (même si il y en aura).\r\n\r\n- [x] les *mixins*\r\n- [x] le mécanisme de *flagging*\r\n- [x] les commandes d'indexations\r\n- [x] Insérer les différents types\r\n- [ ] Gérer le cas des suppressions (en particulier des `PublishedContent`, qui doivent être modifié convenablement quand ils sont mis à jour)\r\n- [ ] le modèle et la vue de recherche (en combinant les dizaines de champs à considérer)\r\n- [ ] la documentation (utilisateur **et** code!)\r\n- [ ] un minimum de tests unitaires (dans la mesure du possible)\r\n- [ ] la sécurité (faudrait implémenter un `.htaccess`, *help*) et le passage par *systemd* (*help!*).\r\n- [ ] définitevement virer solr et haystack.\r\n\r\n### À discuter → #4098\r\n\r\n- [ ] Qu'est ce qu'on indexe comme modèle ?\r\n- [ ] Qu'est ce qu'on indexe comme champ pour chacun de ces modèles ?\r\n- [ ] Qu'est ce qu'on booste comment ?\r\n- [ ] Qu'est ce qu'on utilise comme *tokenizer* et *analyzer* ?\r\n- [ ] Est ce qu'on en profite pour modifier le front de la recherche ?\r\n- [ ] Est ce que si tout fonctionne, on peut récupérer la barre en page d’accueil (quitte à *tuner* le comportement pour favoriser la recherche par mots-clés).\r\n\r\nSujet sur le forum à venir, probablement demain, sauf si @vhf préfère pas.\r\n\r\n### QA\r\n\r\nPour le moment, c'est pas facile à tester, parce qu'il y a que l'indexation qui est implémentée, sur un nombre ridiculement faible de champs.\r\n\r\n+ Téléchargez et installez [elasticsearch](https://www.elastic.co/downloads/elasticsearch) et [kibana](https://www.elastic.co/downloads/kibana). Installez et lancez le premier (port 9200) puis le second (port 5601).\r\n+ Mettez à jour vos *requirements* et vos *migrations*\r\n+ Indexez les *topics* et *post* des forums (seules données indexées pour le moment) à l'aide de `python ./manage.py es_manager index-all` (le nombre de ligne correspond au nombre de données indexées). Une fois que c'est fait, vous pouvez vous amuser à créer des *topics* et des *posts* et utiliser `python ./manage.py es_manager index-flagged` pour mettre à jour elastic. Normalement, vous devez remarquer que le nombre de ligne est moins important ;)\r\n\r\n--------\r\n\r\n**Pour jouer avec les données indexées**\r\n\r\nDans kibana (s'il est démarré), en navigant vers [http://localhost:5601/app/kibana#/dev_tools/console?_g=()](http://localhost:5601/app/kibana#/dev_tools/console?_g=()) vous pouvez jouer avec `GET /zds_search/_search`\r\n\r\nPar exemple, pour visualiser toutes les données indexées:\r\n\r\n```\r\nGET /zds_search/_search\r\n{\r\n  \"query\": {\r\n    \"match_all\": {\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nPour resortir tout les post contenant \"test\" ou les topics dont le titre contient \"test\" (heureusement, y'a une API python pour écrire ce genre de recherches simplement, parce que ça devient vite l'horreur).\r\n\r\n```\r\nGET /zds_search/_search\r\n{\r\n  \"query\": {\r\n    \"bool\": {\r\n      \"should\": [\r\n        {\"match\": {\"title\":\"test\"}},\r\n        {\"match\": {\"text\":\"test\"}}\r\n      ]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n... Et ainsi de suite si vous connaissez un peu elastic."},"comment":{"url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/comments/269377972","html_url":"https://github.com/zestedesavoir/zds-site/pull/4096#issuecomment-269377972","issue_url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4096","id":269377972,"user":{"login":"coveralls","id":2354108,"avatar_url":"https://avatars.githubusercontent.com/u/2354108?v=3","gravatar_id":"","url":"https://api.github.com/users/coveralls","html_url":"https://github.com/coveralls","followers_url":"https://api.github.com/users/coveralls/followers","following_url":"https://api.github.com/users/coveralls/following{/other_user}","gists_url":"https://api.github.com/users/coveralls/gists{/gist_id}","starred_url":"https://api.github.com/users/coveralls/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/coveralls/subscriptions","organizations_url":"https://api.github.com/users/coveralls/orgs","repos_url":"https://api.github.com/users/coveralls/repos","events_url":"https://api.github.com/users/coveralls/events{/privacy}","received_events_url":"https://api.github.com/users/coveralls/received_events","type":"User","site_admin":false},"created_at":"2016-12-27T20:24:14Z","updated_at":"2016-12-27T20:24:14Z","body":"\n[![Coverage Status](https://coveralls.io/builds/9439530/badge)](https://coveralls.io/builds/9439530)\n\nCoverage decreased (-0.9%) to 86.154% when pulling **eb8aaedd82e0e30ec4e99c6c82c289aa54198c34 on pierre-24:add_elasticsearch** into **a66713490fd8f9e8f4b4fef278a5f0ee64f430b2 on zestedesavoir:dev**.\n"}}
{"actor":{"display_login":"coveralls"}}