Skip to main content
This guide walks you through setting up Meilisearch with Dart and Flutter.

Prerequisites

  • Dart 3.0 or higher (or Flutter 3.0+)
  • A Meilisearch instance (Cloud or self-hosted)

1. Install the SDK

Add the dependency to your pubspec.yaml:
dependencies:
  meilisearch: ^0.17.1
Then run:
dart pub get
# or for Flutter
flutter pub get

2. Connect to Meilisearch

import 'package:meilisearch/meilisearch.dart';
import 'dart:io';

final client = MeiliSearchClient(
  Platform.environment['MEILISEARCH_URL']!,
  Platform.environment['MEILISEARCH_API_KEY'],
);
Set your environment variables:
export MEILISEARCH_URL="https://your-instance.meilisearch.io"  # or http://localhost:7700
export MEILISEARCH_API_KEY="your_api_key"
Get a free Cloud instance →

3. Add documents

// Add documents
final movies = [
  {'id': 1, 'title': 'The Matrix', 'genres': ['Action', 'Sci-Fi'], 'year': 1999},
  {'id': 2, 'title': 'Inception', 'genres': ['Action', 'Thriller'], 'year': 2010},
  {'id': 3, 'title': 'Interstellar', 'genres': ['Drama', 'Sci-Fi'], 'year': 2014},
];

final index = client.index('movies');
final task = await index.addDocuments(movies);

// Wait for indexing to complete
await client.waitForTask(task.taskUid);
final result = await index.search('matrix');

for (final hit in result.hits) {
  print('${hit['title']} (${hit['year']})');
}
// The Matrix (1999)

5. Search with filters

First, configure filterable attributes:
await index.updateFilterableAttributes(['genres', 'year']);
Then search with filters:
final result = await index.search(
  '',
  SearchQuery(filter: 'genres = "Sci-Fi" AND year > 2000'),
);

Full example

import 'package:meilisearch/meilisearch.dart';
import 'dart:io';

void main() async {
  // Connect
  final client = MeiliSearchClient(
    Platform.environment['MEILISEARCH_URL']!,
    Platform.environment['MEILISEARCH_API_KEY'],
  );

  // Add documents
  final movies = [
    {'id': 1, 'title': 'The Matrix', 'year': 1999},
    {'id': 2, 'title': 'Inception', 'year': 2010},
    {'id': 3, 'title': 'Interstellar', 'year': 2014},
  ];

  final index = client.index('movies');
  final task = await index.addDocuments(movies);
  await client.waitForTask(task.taskUid);

  // Search
  final result = await index.search('inter');
  for (final hit in result.hits) {
    print(hit['title']);
  }
}

Flutter example

import 'package:flutter/material.dart';
import 'package:meilisearch/meilisearch.dart';

class SearchScreen extends StatefulWidget {
  @override
  _SearchScreenState createState() => _SearchScreenState();
}

class _SearchScreenState extends State<SearchScreen> {
  final client = MeiliSearchClient('YOUR_MEILISEARCH_URL', 'YOUR_SEARCH_KEY');
  List<Map<String, dynamic>> results = [];

  Future<void> search(String query) async {
    final result = await client.index('movies').search(query);
    setState(() {
      results = List<Map<String, dynamic>>.from(result.hits);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextField(onChanged: search),
        Expanded(
          child: ListView.builder(
            itemCount: results.length,
            itemBuilder: (context, index) => ListTile(
              title: Text(results[index]['title']),
            ),
          ),
        ),
      ],
    );
  }
}

Next steps

Full-text search

Configure ranking and relevancy

Filtering

Add filters and facets

AI-powered search

Add semantic search

API reference

Explore all search parameters

Resources