​ Prerequisites

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_KEY'],
);

Set your environment variables:

export MEILISEARCH_URL="https://your-instance.meilisearch.io"  # or http://localhost:7700
export MEILISEARCH_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_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

Configure ranking and relevancy

Filtering

Add filters and facets

Add semantic search

API reference

Explore all search parameters

​ Resources