What tools do we use to collect and visualize data?
We use Segment, a platform for data collection and management, to collect usage data. We then feed that data into Amplitude, a tool for graphing and highlighting data, so that we can build visualizations according to our needs.What kind of data do we collect?
Our data collection is focused on the following categories:- System metrics, such as the technical specs of the device running Meilisearch, the software version, and the OS
- Performance metrics, such as the success rate of search requests and the average latency
- Usage metrics, aimed at evaluating our newest features. These change with each new version
- Identify or track users
- Collect personal information such as IP addresses, email addresses, or website URLs
- Store data from documents added to a Meilisearch instance
Why collect telemetry data?
We collect telemetry data for only two reasons: so that we can improve our product, and so that we can continue working on this project full-time. In order to create a better product, we need reliable quantitative information. The data we collect helps us fix bugs, evaluate the success of features, and better understand our users’ needs. We also need to prove that people are actually using Meilisearch. Usage metrics help us justify our existence to investors so that we can keep this project alive.Why should you trust us?
Don’t trust us—hold us accountable. We feel that it is understandable, and in fact wise, to be distrustful of tech companies when it comes to your private data. That is why we attempt to maintain complete transparency about our data collection, provide an opt-out, and enable users to request the deletion of all their collected data at any time. In the absence of global data protection laws, we believe that this is the only ethical way to approach data collection. No company is perfect. If you ever feel that we are being anything less than 100% transparent or collecting data that is infringing on your personal privacy, please let us know by emailing our dedicated account: [email protected]. Similarly, if you discover a data rights initiative or data protection tool that you think is relevant to us, please share it. We are passionate about this subject and take it very seriously.How to disable data collection
Data collection can be disabled at any time by setting a command-line option or environment variable, then restarting the Meilisearch instance.- Command-line option
- Environment variable
- With systemctl
How to delete all collected data
We, the Meilisearch team, provide an email address so that users can request the complete removal of their data from all of our tools. To do so, send an email to [email protected] containing the unique identifier generated for your Meilisearch installation (Instance UID when launching Meilisearch). Any questions regarding the management of the data we collect can also be sent to this email address.
Exhaustive list of all collected data
Whenever an event is triggered that collects some piece of data, Meilisearch does not send it immediately. Instead, it bundles it with other data in a batch of up to500kb. Batches are sent either every hour, or after reaching 500kb—whichever occurs first. This is done in order to improve performance and reduce network traffic.
This list is liable to change with every new version of Meilisearch. It’s not because we’re trying to be sneaky! It’s because when we add new features we need to collect additional data points to see how they perform.
| Metric name | Description | Example | 
|---|---|---|
| context.app.version | Meilisearch version number | 1.3.0 | 
| infos.env | Value of --env/MEILI_ENV | production | 
| infos.db_path | trueif--db-path/MEILI_DB_PATHis specified | true | 
| infos.import_dump | trueif--import-dumpis specified | true | 
| infos.dump_dir | trueif--dump-dir/MEILI_DUMP_DIRis specified | true | 
| infos.ignore_missing_dump | trueif--ignore-missing-dumpis activated | true | 
| infos.ignore_dump_if_db_exists | trueif--ignore-dump-if-db-existsis activated | true | 
| infos.import_snapshot | trueif--import-snapshotis specified | true | 
| infos.schedule_snapshot | Value of --schedule_snapshot/MEILI_SCHEDULE_SNAPSHOTif set, otherwiseNone | 86400 | 
| infos.snapshot_dir | trueif--snapshot-dir/MEILI_SNAPSHOT_DIRis specified | true | 
| infos.ignore_missing_snapshot | trueif--ignore-missing-snapshotis activated | true | 
| infos.ignore_snapshot_if_db_exists | trueif--ignore-snapshot-if-db-existsis activated | true | 
| infos.http_addr | trueif--http-addr/MEILI_HTTP_ADDRis specified | true | 
| infos.http_payload_size_limit | Value of --http-payload-size-limit/MEILI_HTTP_PAYLOAD_SIZE_LIMITin bytes | 336042103 | 
| infos.log_level | Value of --log-level/MEILI_LOG_LEVEL | debug | 
| infos.max_indexing_memory | Value of --max-indexing-memory/MEILI_MAX_INDEXING_MEMORYin bytes | 336042103 | 
| infos.max_indexing_threads | Value of --max-indexing-threads/MEILI_MAX_INDEXING_THREADSin integer | 4 | 
| infos.log_level | Value of --log-level/MEILI_LOG_LEVEL | debug | 
| infos.ssl_auth_path | trueif--ssl-auth-path/MEILI_SSL_AUTH_PATHis specified | false | 
| infos.ssl_cert_path | trueif--ssl-cert-path/MEILI_SSL_CERT_PATHis specified | false | 
| infos.ssl_key_path | trueif--ssl-key-path/MEILI_SSL_KEY_PATHis specified | false | 
| infos.ssl_ocsp_path | trueif--ssl-ocsp-path/MEILI_SSL_OCSP_PATHis specified | false | 
| infos.ssl_require_auth | Value of --ssl-require-auth/MEILI_SSL_REQUIRE_AUTHas a boolean | false | 
| infos.ssl_resumption | trueif--ssl-resumption/MEILI_SSL_RESUMPTIONis specified | false | 
| infos.ssl_tickets | trueif--ssl-tickets/MEILI_SSL_TICKETSis specified | false | 
| system.distribution | Distribution on which Meilisearch is launched | Arch Linux | 
| system.kernel_version | Kernel version on which Meilisearch is launched | 5.14.10 | 
| system.cores | Number of cores | 24 | 
| system.ram_size | Total RAM capacity. Expressed in KB | 16777216 | 
| system.disk_size | Total capacity of the largest disk. Expressed in Bytes | 1048576000 | 
| system.server_provider | Value of MEILI_SERVER_PROVIDERenvironment variable | AWS | 
| stats.database_size | Database size. Expressed in Bytes | 2621440 | 
| stats.indexes_number | Number of indexes | 2 | 
| start_since_days | Number of days since instance was launched | 365 | 
| user_agent | User-agent header encountered during API calls | [“Meilisearch Ruby (2.1)”, “Ruby (3.0)“] | 
| requests.99th_response_time | Highest latency from among the fastest 99% of successful search requests | 57ms | 
| requests.total_succeeded | Total number of successful requests | 3456 | 
| requests.total_failed | Total number of failed requests | 24 | 
| requests.total_received | Total number of received search requests | 3480 | 
| requests.total_degraded | Total number of searches canceled after reaching search time cut-off | 100 | 
| requests.total_used_negative_operator | Count searches using either a negative word or a negative phrase operator | 173 | 
| sort.with_geoPoint | trueif the sort rule_geoPointis specified | true | 
| sort.avg_criteria_number | Average number of sort criteria among all search requests containing the sortparameter | 2 | 
| filter.with_geoBoundingBox | trueif the filter rule_geoBoundingBoxis specified | false | 
| filter.with_geoRadius | trueif the filter rule_geoRadiusis specified | false | 
| filter.most_used_syntax | Most used filter syntax among all search requests containing the filterparameter | string | 
| filter.on_vectors | trueif the filter rule includes_vector | false | 
| q.max_terms_number | Highest number of terms given for the qparameter | 5 | 
| pagination.max_limit | Highest value given for the limitparameter | 60 | 
| pagination.max_offset | Highest value given for the offsetparameter | 1000 | 
| formatting.max_attributes_to_retrieve | Maximum number of attributes to retrieve | 100 | 
| formatting.max_attributes_to_highlight | Maximum number of attributes to highlight | 100 | 
| formatting.highlight_pre_tag | trueifhighlightPreTagis specified | false | 
| formatting.highlight_post_tag | trueifhighlightPostTagis specified | false | 
| formatting.max_attributes_to_crop | Maximum number of attributes to crop | 100 | 
| formatting.crop_length | trueifcropLengthis specified | false | 
| formatting.crop_marker | trueifcropMarkeris specified | false | 
| formatting.show_matches_position | trueifshowMatchesPositionis used in this batch | false | 
| facets.avg_facets_number | Average number of facets | 10 | 
| primary_key | Name of primary key when explicitly set. Otherwise null | id | 
| payload_type | All values encountered in the Content-Typeheader, including invalid ones | [“application/json”, “text/plain”, “application/x-ndjson”] | 
| index_creation | trueif a document addition or update request triggered index creation | true | 
| ranking_rules.words_position | Position of the wordsranking rule if any, otherwisenull | 1 | 
| ranking_rules.typo_position | Position of the typoranking rule if any, otherwisenull | 2 | 
| ranking_rules.proximity_position | Position of the proximityranking rule if any, otherwisenull | 3 | 
| ranking_rules.attribute_position | Position of the attributeranking rule if any, otherwisenull | 4 | 
| ranking_rules.sort_position | Position of the sortranking rule | 5 | 
| ranking_rules.exactness_position | Position of the exactnessranking rule if any, otherwisenull | 6 | 
| ranking_rules.values | A string representing the ranking rules without the custom asc-desc rules | ”words, typo, attribute, sort, exactness” | 
| sortable_attributes.total | Number of sortable attributes | 3 | 
| sortable_attributes.has_geo | trueif_geois set as a sortable attribute | true | 
| filterable_attributes.total | Number of filterable attributes | 3 | 
| filterable_attributes.has_geo | trueif_geois set as a filterable attribute | false | 
| filterable_attributes.has_patterns | trueiffilterableAttributesusesattributePatterns | true | 
| searchable_attributes.total | Number of searchable attributes | 4 | 
| searchable_attributes.with_wildcard | trueif*is specified as a searchable attribute | false | 
| per_task_uid | trueif auidsis used to fetch a particular task resource | true | 
| filtered_by_uid | trueif tasks are filtered by theuidsquery parameter | false | 
| filtered_by_index_uid | trueif tasks are filtered by theindexUidsquery parameter | false | 
| filtered_by_type | trueif tasks are filtered by thetypesquery parameter | false | 
| filtered_by_status | trueif tasks are filtered by thestatusesquery parameter | false | 
| filtered_by_canceled_by | trueif tasks are filtered by thecanceledByquery parameter | false | 
| filtered_by_before_enqueued_at | trueif tasks are filtered by thebeforeEnqueuedAtquery parameter | false | 
| filtered_by_after_enqueued_at | trueif tasks are filtered by theafterEnqueuedAtquery parameter | false | 
| filtered_by_before_started_at | trueif tasks are filtered by thebeforeStartedAtquery parameter | false | 
| filtered_by_after_started_at | trueif tasks are filtered by theafterStartedAtquery parameter | false | 
| filtered_by_before_finished_at | trueif tasks are filtered by thebeforeFinishedAtquery parameter | false | 
| filtered_by_after_finished_at | trueif tasks are filtered by theafterFinishedAtquery parameter | false | 
| typo_tolerance.enabled | trueif typo tolerance is enabled | true | 
| typo_tolerance.disable_on_attributes | trueif at least one value is defined fordisableOnAttributes | false | 
| typo_tolerance.disable_on_words | trueif at least one value is defined fordisableOnWords | false | 
| typo_tolerance.min_word_size_for_typos.one_typo | The defined value for the minWordSizeForTypos.oneTypoparameter | 5 | 
| typo_tolerance.min_word_size_for_typos.two_typos | The defined value for the minWordSizeForTypos.twoTyposparameter | 9 | 
| pagination.max_total_hits | The defined value for the pagination.maxTotalHitsproperty | 1000 | 
| faceting.max_values_per_facet | The defined value for the faceting.maxValuesPerFacetproperty | 100 | 
| distinct_attribute.set | trueif a field name is specified | false | 
| distinct | trueif a distinct was specified in an aggregated list of requests | true | 
| proximity_precision.set | trueif the setting has been manually set. | false | 
| proximity_precision.value | byWordorbyAttribute. | byWord | 
| facet_search.set | facetSearchhas been changed by the user | true | 
| facet_search.value | facetSearchvalue set by the user | true | 
| prefix_search.set | prefixSearchhas been changed by the user | true | 
| prefix_search.value | prefixSearchvalue set by the user | indexingTime | 
| displayed_attributes.total | Number of displayed attributes | 3 | 
| displayed_attributes.with_wildcard | trueif*is specified as a displayed attribute | false | 
| stop_words.total | Number of stop words | 3 | 
| separator_tokens.total | Number of separator tokens | 3 | 
| non_separator_tokens.total | Number of non-separator tokens | 3 | 
| dictionary.total | Number of words in the dictionary | 3 | 
| synonyms.total | Number of synonyms | 3 | 
| per_index_uid | trueif theuidis used to fetch an index stat resource | false | 
| searches.avg_search_count | The average number of search queries received per call for the aggregated event | 4.2 | 
| searches.total_search_count | The total number of search queries received for the aggregated event | 16023 | 
| indexes.avg_distinct_index_count | The average number of queried indexes received per call for the aggregated event | 1.2 | 
| indexes.total_distinct_index_count | The total number of distinct index queries for the aggregated event | 6023 | 
| indexes.total_single_index | The total number of calls when only one index is queried | 2007 | 
| matching_strategy.most_used_strategy | Most used word matching strategy | last | 
| infos.with_configuration_file | trueif the instance is launched with a configuration file | false | 
| infos.experimental_composite_embedders | trueif thecompositeEmbeddersfeature is set totruefor this instance | false | 
| infos.experimental_contains_filter | trueif thecontainsFilterexperimental feature is enabled | false | 
| infos.experimental_edit_documents_by_function | trueif theeditDocumentsByFunctionexperimental feature is enabled | false | 
| infos.experimental_enable_metrics | trueif--experimental-enable-metricsis specified at launch | false | 
| infos.experimental_embedding_cache_entries | Size of configured embedding cache | 100 | 
| infos.experimental_multimodal | truewhen multimodal search feature is enabled | true | 
| infos.experimental_no_edition_2024_for_settings | trueif instance disabled new indexer | false | 
| infos.experimental_replication_parameters | trueif--experimental-replication-parametersis specified at launch | false | 
| infos.experimental_reduce_indexing_memory_usage | trueif--experimental-reduce-indexing-memory-usageis specified at launch | false | 
| infos.experimental_logs_mode | humanorjsondepending on the value specified | human | 
| infos.experimental_enable_logs_route | trueif--experimental-enable-logs-routeis specified at launch | false | 
| infos.gpu_enabled | trueif Meilisearch was compiled with CUDA support | false | 
| swap_operation_number | Number of swap operations | 2 | 
| pagination.most_used_navigation | Most used search results navigation | estimated | 
| per_document_id | trueif theDELETE /indexes/:indexUid/documents/:documentUidendpoint was used | false | 
| per_filter | trueifPOST /indexes/:indexUid/documents/fetch,GET /indexes/:indexUid/documents/, orPOST /indexes/:indexUid/documents/deleteendpoints were used | false | 
| clear_all | trueifDELETE /indexes/:indexUid/documentsendpoint was used | false | 
| per_batch | trueif thePOST /indexes/:indexUid/documents/delete-batchendpoint was used | false | 
| facets.total_distinct_facet_count | Total number of distinct facets queried for the aggregated event | false | 
| facets.additional_search_parameters_provided | trueif additional search parameters were provided for the aggregated event | false | 
| faceting.sort_facet_values_by_star_count | trueif all fields are set to be sorted by count | false | 
| faceting.sort_facet_values_by_total | The number of different values that were set | 10 | 
| scoring.show_ranking_score | trueifshowRankingScoreused in the aggregated event | true | 
| scoring.show_ranking_score_details | trueifshowRankingScoreDetailswas used in the aggregated event | true | 
| scoring.ranking_score_threshold | trueif rankingScoreThreshold was specified in an aggregated list of requests | true | 
| attributes_to_search_on.total_number_of_uses | Total number of queries where attributesToSearchOnis set | 5 | 
| vector.max_vector_size | Highest number of dimensions given for the vectorparameter in this batch | 1536 | 
| vector.retrieve_vectors | trueif the retrieve_vectors parameter has been used in this batch. | false | 
| hybrid.enabled | trueif hybrid search been used in the aggregated event | true | 
| hybrid.semantic_ratio | trueif semanticRatio was used in this batch, otherwise false | false | 
| hybrid.total_media | Aggregated number of search requests where mediais notnull | 42 | 
| embedders.total | Numbers of defined embedders | 2 | 
| embedders.sources | An array representing the different provided sources | [“huggingFace”, “userProvided”] | 
| embedders.document_template_used | A boolean indicating if one of the provided embedders has a custom template defined | true | 
| embedders.document_template_max_bytes | A value indicating the largest value for document TemplateMaxBytes across all embedder | 400 | 
| embedders.binary_quantization_used | trueif the user updated the binary quantized field of the embedded settings | false | 
| infos.task_queue_webhook | trueif the instance is launched with a task queue webhook | false | 
| infos.experimental_search_queue_size | Size of the search queue | 750 | 
| infos.experimental_dumpless_upgrade | trueif instance is launched with the parameter | true | 
| locales | List of locales used with /searchand/settingsroutes | [“fra”, “eng”] | 
| federation.use_federation | truewhen at least one multi-search request contains a top-level federation object | false | 
| network_has_self | trueif the network object has a non-null self field | true | 
| network_size | Number of declared remotes | 0 | 
| network | truewhen the network experimental feature is enabled | true | 
| experimental_network | truewhen the network experimental feature is enabled | true | 
| remotes.total_distinct_remote_count | Sum of the number of distinct remotes appearing in each search request of the aggregate | 48 | 
| remotes.avg_distinct_remote_count | Average number of distinct remotes appearing in a search request of the aggregate | 2.33 | 
| multimodal | truewhen multimodal search is enabled via the/experimental-featuresroute | true | 
| export.total_received | Number of exports received in this batch | 152 | 
| export.has_api_key | Number of exports with an API Key set | 89 | 
| export.avg_index_patterns | Average number of index patterns set per export | 3.2 | 
| export.avg_patterns_with_filter | Average number of index patterns with filters per export | 1.7 | 
| export.avg_payload_size | Average payload size per export | 512 | 
| webhooks_created | Number of webhooks created in an instance | 2 | 
| webhooks.updated | Number of times all webhooks in an instance have been updated | 5 | 
| with_vector_filter | truewhen a document fetch request used a vector filter | false |