Recap and final exam
Sixteen modules to move from LIKE '%word%' to a complete search and recommendation engine: Veille indexes 200,853 articles, retrieves them by relevance and despite typos, analyzes them in Kibana, links 23,082 authors to 41 categories in Neo4j, and recommends what to read next from a Python script. Here is the course condensed, the threads that run through it, and the checklist of an engine ready to demo to a client.
The course at a glance
| Module | The essential point |
|---|---|
| 1. Veille kit | doctor before up; up waits for every service to answer; reset returns to a clean state. Kibana on 5601, Neo4j Browser on 7474, everything in veille2026. |
| 2. Core concepts | An index is split into shards, each shard can have replicas; a single node stays green with zero replicas; _cat and _cluster/health are read first. |
3. Documents and _bulk | PUT creates or replaces, POST _update merges, _seq_no/_primary_term guard against overwrites; _bulk = NDJSON, two lines per document, batches of 1,000 to 5,000. |
| 4. Mapping | text is analyzed for search, keyword is exact for filtering, sorting, and aggregating; dynamic mapping guesses, explicit mapping decides; changing a type = _reindex. |
| 5. Query DSL | match for text, term for exact, range for dates; bool combines must, should, filter, must_not; filter context computes no score and is cached. |
| 6. Aggregations | size: 0; terms, date_histogram with calendar_interval, cardinality, stats, top_hits; sub-aggregations answer crossed questions (categories per year). |
| 7. Kibana | Data View with time field date and range 2012-2018; Discover + KQL to explore; Lens to visualize; a dashboard exports as .ndjson. |
| 8. Advanced search | completion on headline.suggest (max_input_length 120), fuzziness: AUTO, phrase suggester; ES|QL chains FROM, WHERE, STATS … BY, SORT; aliases enable reindexing without downtime. |
| 9. OpenSearch | Fork of Elasticsearch 7.10 under Apache 2.0 since 2021; same base queries, different security and plugins; choose by license, host, and features, not by fashion. |
| 10. Neo4j and Cypher | Nodes, labels, directed and typed relationships, properties; MATCH (a)-[:REL]->(b) reads the graph the way you draw it; MERGE over CREATE for replayable scripts. |
| 11. Model and load | What you filter or traverse becomes a node, what you display stays a property; uniqueness constraints first; LOAD CSV + CALL { } IN TRANSACTIONS (with :auto in Browser). |
| 12. Advanced Cypher | Paths *1..3, shortestPath, OPTIONAL MATCH, WITH/collect/UNWIND, CASE; neighborhood recommendation fits in one query; PROFILE reveals missing indices and cartesian products. |
| 13. Python | ./lab.sh python runs your scripts with the official clients; Elasticsearch(url, basic_auth) and GraphDatabase.driver(uri, auth); veille.py combines search and recommendation. |
| 14. Security and operations | Users and roles _security, API keys, fs snapshots with path.repo; Neo4j Community handles users but no fine-grained roles; _cat/nodes and docker stats for monitoring. |
| 15. Diagnosis | Twelve failures, one method: status, logs, isolate, reset, ask for help with the right information. |
| 16. Veille project | Justified mapping, five queries per persona, four-visualization dashboard, verified graph, five recommendation queries, combined script, five-minute demo. |
The threads running through the course
The mapping decides everything that comes after. A category in text does not aggregate cleanly, a title in keyword cannot be searched, a date as a string cannot be sorted. Module 4 sets the rule, modules 5 to 8 live by it: every query that "finds nothing" or every aggregation that "returns bits of words" is fixed in the mapping, therefore by a _reindex, never by twisting the query.
Searching and filtering are two different operations. The query context computes a score and is expensive; the filter context answers yes or no and is cached. Putting category and date in filter and keeping headline in must is not a stylistic quirk: it is what keeps the Veille engine fast under load. Kibana applies the same separation between the KQL bar and the pinned filters.
The graph answers questions that joins make unreadable. Who writes in the same categories as Lee Moran? Which recent articles are by the authors from that result? Which chain links two authors? In SQL, every extra depth adds a join; in Cypher, *1..3 is enough. Elasticsearch finds the entry point, Neo4j explores around it: module 13 combines them in the same script, module 16 turns them into a product.
A failure must be read before it is fixed. Exit code 137, cluster_block_exception, "Couldn't load the external resource", "can only be executed in an implicit transaction": every message from module 15 corresponds to a single cause and a single kit command. The reflex to acquire is not to restart at random but to read ./lab.sh status and then ./lab.sh logs <service>.
Checklist of a Veille engine ready to demo
./lab.sh doctorfully green,./lab.sh statusshows threehealthycontainers.GET news/_countreturns 200,853 andGET news/_mappingshowscategoryaskeyword,headlineastextwithrawandsuggest,dateasdate.- One
boolquery per persona, withheadlineinmustandcategory+dateinfilter, each one commented (what it searches for, why that score). - A
termsaggregation oncategoryand a monthlydate_histogram, whose numbers match the Kibana dashboard. - A
newsData View with time fielddate, a four-visualization dashboard exported as.ndjsonin the project folder. - An autocomplete query on
headline.suggestand a typo-tolerant search withfuzziness: AUTO. CALL apoc.meta.stats()returns 200,853Article, 41Categorie, 23,082Auteur;SHOW CONSTRAINTSlists the three uniqueness constraints.- Five Cypher recommendation queries, including one by author neighborhood and one by path, each passed through
PROFILEwithout a cartesian product. ./lab.sh python veille.py <topic>returns results and recommendations in under five seconds, with a category and period filter.- A read-only Elasticsearch user for Karim's API and a restorable snapshot of the
newsindex. - The twelve-failure table reread, and the certainty of knowing what to do in front of each.
The final exam
The exam contains 40 questions covering the sixteen modules: kit and concepts, documents and _bulk, mapping and analyzers, Query DSL and relevance, aggregations, Kibana, autocomplete and ES|QL, OpenSearch, Cypher and modeling, LOAD CSV, advanced Cypher, Python, security and backups, diagnosis, project.
Several questions present situations to diagnose: which field type to choose for a category you want to aggregate; why a match query on a keyword returns nothing; what a yellow cluster on a single node means; how to read a cluster_block_exception; why LOAD CSV cannot find news.csv; what the difference is between MERGE and CREATE when replaying a script; which engine to pick for which business question. It is judgement that is assessed — naming the cause, choosing the fitting query or command — not the recitation of a vocabulary.
On success, your certificate of completion is issued immediately; its number is verifiable by any third party on the platform.
Go back through the checklist above. For every line, ask yourself "would I know how to write the query or the command that verifies it?". If you can write a bool with must and filter, a date_histogram, a uniqueness constraint followed by a batched LOAD CSV, and a neighborhood recommendation query, you are ready. Good luck!
Final exam
Ready to validate this course?
40 questions drawn at random from the course bank · passing score 70% · verifiable PDF certificate issued immediately on success.
Start the examYou need to be signed in to your InSkillML account with an active subscription. You can also start the exam from My courses.