Meilisearch collects anonymized data from users in order to improve our product. This can be deactivated at any time, and any data that has already been collected can be deleted on request.

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

See below for the complete list of metrics we currently collect.

We will never:

  • 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.

For more information about configuring Meilisearch, read our configuration reference.

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 to 500kb. 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 nameDescriptionExample
context.app.versionMeilisearch version number1.3.0
infos.envValue of --env/MEILI_ENVproduction
infos.db_pathtrue if --db-path/MEILI_DB_PATH is specifiedtrue
infos.import_dumptrue if --import-dump is specifiedtrue
infos.dump_dirtrue if --dump-dir/MEILI_DUMP_DIR is specifiedtrue
infos.ignore_missing_dumptrue if --ignore-missing-dump is activatedtrue
infos.ignore_dump_if_db_existstrue if --ignore-dump-if-db-exists is activatedtrue
infos.import_snapshottrue if --import-snapshot is specifiedtrue
infos.schedule_snapshotValue of --schedule_snapshot/MEILI_SCHEDULE_SNAPSHOT if set, otherwise None86400
infos.snapshot_dirtrue if --snapshot-dir/MEILI_SNAPSHOT_DIR is specifiedtrue
infos.ignore_missing_snapshottrue if --ignore-missing-snapshot is activatedtrue
infos.ignore_snapshot_if_db_existstrue if --ignore-snapshot-if-db-exists is activatedtrue
infos.http_addrtrue if --http-addr/MEILI_HTTP_ADDR is specifiedtrue
infos.http_payload_size_limitValue of --http-payload-size-limit/MEILI_HTTP_PAYLOAD_SIZE_LIMIT in bytes336042103
infos.log_levelValue of --log-level/MEILI_LOG_LEVELdebug
infos.max_indexing_memoryValue of --max-indexing-memory/MEILI_MAX_INDEXING_MEMORY in bytes336042103
infos.max_indexing_threadsValue of --max-indexing-threads/MEILI_MAX_INDEXING_THREADS in integer4
infos.log_levelValue of --log-level/MEILI_LOG_LEVELdebug
infos.ssl_auth_pathtrue if --ssl-auth-path/MEILI_SSL_AUTH_PATH is specifiedfalse
infos.ssl_cert_pathtrue if --ssl-cert-path/MEILI_SSL_CERT_PATH is specifiedfalse
infos.ssl_key_pathtrue if --ssl-key-path/MEILI_SSL_KEY_PATH is specifiedfalse
infos.ssl_ocsp_pathtrue if --ssl-ocsp-path/MEILI_SSL_OCSP_PATH is specifiedfalse
infos.ssl_require_authValue of --ssl-require-auth/MEILI_SSL_REQUIRE_AUTH as a booleanfalse
infos.ssl_resumptiontrue if --ssl-resumption/MEILI_SSL_RESUMPTION is specifiedfalse
infos.ssl_ticketstrue if --ssl-tickets/MEILI_SSL_TICKETS is specifiedfalse
system.distributionDistribution on which Meilisearch is launchedArch Linux
system.kernel_versionKernel version on which Meilisearch is launched5.14.10
system.coresNumber of cores24
system.ram_sizeTotal RAM capacity. Expressed in KB16777216
system.disk_sizeTotal capacity of the largest disk. Expressed in Bytes1048576000
system.server_providerValue of MEILI_SERVER_PROVIDER environment variableAWS
stats.database_sizeDatabase size. Expressed in Bytes2621440
stats.indexes_numberNumber of indexes2
start_since_daysNumber of days since instance was launched365
user_agentUser-agent header encountered during API calls[“Meilisearch Ruby (2.1)”, “Ruby (3.0)“]
requests.99th_response_timeHighest latency from among the fastest 99% of successful search requests57ms
requests.total_succeededTotal number of successful requests3456
requests.total_failedTotal number of failed requests24
requests.total_receivedTotal number of received search requests3480
requests.total_degradedTotal number of searches canceled after reaching search time cut-off100
requests.total_used_negative_operatorCount searches using either a negative word or a negative phrase operator173
sort.with_geoPointtrue if the sort rule _geoPoint is specifiedtrue
sort.avg_criteria_numberAverage number of sort criteria among all search requests containing the sort parameter2
filter.with_geoBoundingBoxtrue if the filter rule _geoBoundingBox is specifiedfalse
filter.with_geoRadiustrue if the filter rule _geoRadius is specifiedfalse
filter.most_used_syntaxMost used filter syntax among all search requests containing the filter parameterstring
q.max_terms_numberHighest number of terms given for the q parameter5
pagination.max_limitHighest value given for the limit parameter60
pagination.max_offsetHighest value given for the offset parameter1000
formatting.max_attributes_to_retrieveMaximum number of attributes to retrieve100
formatting.max_attributes_to_highlightMaximum number of attributes to highlight100
formatting.highlight_pre_tagtrue if highlightPreTag is specifiedfalse
formatting.highlight_post_tagtrue if highlightPostTag is specifiedfalse
formatting.max_attributes_to_cropMaximum number of attributes to crop100
formatting.crop_lengthtrue if cropLength is specifiedfalse
formatting.crop_markertrue if cropMarker is specifiedfalse
formatting.show_matches_positiontrue if showMatchesPosition is used in this batchfalse
facets.avg_facets_numberAverage number of facets10
primary_keyName of primary key when explicitly set. Otherwise nullid
payload_typeAll values encountered in the Content-Type header, including invalid ones[“application/json”, “text/plain”, “application/x-ndjson”]
index_creationtrue if a document addition or update request triggered index creationtrue
ranking_rules.words_positionPosition of the words ranking rule if any, otherwise null1
ranking_rules.typo_positionPosition of the typo ranking rule if any, otherwise null2
ranking_rules.proximity_positionPosition of the proximity ranking rule if any, otherwise null3
ranking_rules.attribute_positionPosition of the attribute ranking rule if any, otherwise null4
ranking_rules.sort_positionPosition of the sort ranking rule5
ranking_rules.exactness_positionPosition of the exactness ranking rule if any, otherwise null6
ranking_rules.valuesA string representing the ranking rules without the custom asc-desc rules”words, typo, attribute, sort, exactness”
sortable_attributes.totalNumber of sortable attributes3
sortable_attributes.has_geotrue if _geo is set as a sortable attributetrue
filterable_attributes.totalNumber of filterable attributes3
filterable_attributes.has_geotrue if _geo is set as a filterable attributefalse
filterable_attributes.has_patternstrue if filterableAttributes uses attributePatternstrue
searchable_attributes.totalNumber of searchable attributes4
searchable_attributes.with_wildcardtrue if * is specified as a searchable attributefalse
per_task_uidtrue if a uids is used to fetch a particular task resourcetrue
filtered_by_uidtrue if tasks are filtered by the uids query parameterfalse
filtered_by_index_uidtrue if tasks are filtered by the indexUids query parameterfalse
filtered_by_typetrue if tasks are filtered by the types query parameterfalse
filtered_by_statustrue if tasks are filtered by the statuses query parameterfalse
filtered_by_canceled_bytrue if tasks are filtered by the canceledBy query parameterfalse
filtered_by_before_enqueued_attrue if tasks are filtered by the beforeEnqueuedAt query parameterfalse
filtered_by_after_enqueued_attrue if tasks are filtered by the afterEnqueuedAt query parameterfalse
filtered_by_before_started_attrue if tasks are filtered by the beforeStartedAt query parameterfalse
filtered_by_after_started_attrue if tasks are filtered by the afterStartedAt query parameterfalse
filtered_by_before_finished_attrue if tasks are filtered by the beforeFinishedAt query parameterfalse
filtered_by_after_finished_attrue if tasks are filtered by the afterFinishedAt query parameterfalse
typo_tolerance.enabledtrue if typo tolerance is enabledtrue
typo_tolerance.disable_on_attributestrue if at least one value is defined for disableOnAttributesfalse
typo_tolerance.disable_on_wordstrue if at least one value is defined for disableOnWordsfalse
typo_tolerance.min_word_size_for_typos.one_typoThe defined value for the minWordSizeForTypos.oneTypo parameter5
typo_tolerance.min_word_size_for_typos.two_typosThe defined value for the minWordSizeForTypos.twoTypos parameter9
pagination.max_total_hitsThe defined value for the pagination.maxTotalHits property1000
faceting.max_values_per_facetThe defined value for the faceting.maxValuesPerFacet property100
distinct_attribute.settrue if a field name is specifiedfalse
distincttrue if a distinct was specified in an aggregated list of requeststrue
proximity_precision.settrue if the setting has been manually set.false
proximity_precision.valuebyWord or byAttribute.byWord
facet_search.setfacetSearch has been changed by the usertrue
facet_search.valuefacetSearch value set by the usertrue
prefix_search.setprefixSearch has been changed by the usertrue
prefix_search.valueprefixSearch value set by the userindexingTime
displayed_attributes.totalNumber of displayed attributes3
displayed_attributes.with_wildcardtrue if * is specified as a displayed attributefalse
stop_words.totalNumber of stop words3
separator_tokens.totalNumber of separator tokens3
non_separator_tokens.totalNumber of non-separator tokens3
dictionary.totalNumber of words in the dictionary3
synonyms.totalNumber of synonyms3
per_index_uidtrue if the uid is used to fetch an index stat resourcefalse
searches.avg_search_countThe average number of search queries received per call for the aggregated event4.2
searches.total_search_countThe total number of search queries received for the aggregated event16023
indexes.avg_distinct_index_countThe average number of queried indexes received per call for the aggregated event1.2
indexes.total_distinct_index_countThe total number of distinct index queries for the aggregated event6023
indexes.total_single_indexThe total number of calls when only one index is queried2007
matching_strategy.most_used_strategyMost used word matching strategylast
infos.with_configuration_filetrue if the instance is launched with a configuration filefalse
infos.experimental_composite_embedderstrue if the compositeEmbedders feature is set to true for this instancefalse
infos.experimental_contains_filtertrue if the containsFilter experimental feature is enabledfalse
infos.experimental_edit_documents_by_functiontrue if the editDocumentsByFunction experimental feature is enabledfalse
infos.experimental_enable_metricstrue if --experimental-enable-metrics is specified at launchfalse
infos.experimental_embedding_cache_entriesSize of configured embedding cache100
infos.experimental_replication_parameterstrue if --experimental-replication-parameters is specified at launchfalse
infos.experimental_reduce_indexing_memory_usagetrue if --experimental-reduce-indexing-memory-usage is specified at launchfalse
infos.experimental_logs_modehuman or json depending on the value specifiedhuman
infos.experimental_enable_logs_routetrue if --experimental-enable-logs-route is specified at launchfalse
infos.gpu_enabledtrue if Meilisearch was compiled with CUDA supportfalse
swap_operation_numberNumber of swap operations2
pagination.most_used_navigationMost used search results navigationestimated
per_document_idtrue if the DELETE /indexes/:indexUid/documents/:documentUid endpoint was usedfalse
per_filtertrue if POST /indexes/:indexUid/documents/fetch, GET /indexes/:indexUid/documents/, or POST /indexes/:indexUid/documents/delete endpoints were usedfalse
clear_alltrue if DELETE /indexes/:indexUid/documents endpoint was usedfalse
per_batchtrue if the POST /indexes/:indexUid/documents/delete-batch endpoint was usedfalse
facets.total_distinct_facet_countTotal number of distinct facets queried for the aggregated eventfalse
facets.additional_search_parameters_providedtrue if additional search parameters were provided for the aggregated eventfalse
faceting.sort_facet_values_by_star_counttrue if all fields are set to be sorted by countfalse
faceting.sort_facet_values_by_totalThe number of different values that were set10
scoring.show_ranking_scoretrue if showRankingScore used in the aggregated eventtrue
scoring.show_ranking_score_detailstrue if showRankingScoreDetails was used in the aggregated eventtrue
scoring.ranking_score_thresholdtrue if rankingScoreThreshold was specified in an aggregated list of requeststrue
attributes_to_search_on.total_number_of_usesTotal number of queries where attributesToSearchOn is set5
vector.max_vector_sizeHighest number of dimensions given for the vector parameter in this batch1536
vector.retrieve_vectorstrue if the retrieve_vectors parameter has been used in this batch.false
hybrid.enabledtrue if hybrid search been used in the aggregated eventtrue
hybrid.semantic_ratiotrue if semanticRatio was used in this batch, otherwise falsefalse
embedders.totalNumbers of defined embedders2
embedders.sourcesAn array representing the different provided sources[“huggingFace”, “userProvided”]
embedders.document_template_usedA boolean indicating if one of the provided embedders has a custom template definedtrue
embedders.document_template_max_bytesA value indicating the largest value for document TemplateMaxBytes across all embedder400
embedders.binary_quantization_usedtrue if the user updated the binary quantized field of the embedded settingsfalse
infos.task_queue_webhooktrue if the instance is launched with a task queue webhookfalse
infos.experimental_search_queue_sizeSize of the search queue750
infos.experimental_dumpless_upgradetrue if instance is launched with the parametertrue
localesList of locales used with /search and /settings routes[“fra”, “eng”]
federation.use_federationtrue when at least one multi-search request contains a top-level federation objectfalse
network_has_selftrue if the network object has a non-null self fieldtrue
network_sizeNumber of declared remotes0
networktrue when the network experimental feature is enabledtrue
experimental_networktrue when the network experimental feature is enabledtrue
remotes.total_distinct_remote_countSum of the number of distinct remotes appearing in each search request of the aggregate48
remotes.avg_distinct_remote_countAverage number of distinct remotes appearing in a search request of the aggregate2.33

Was this page helpful?