Flutter全文搜索引擎插件meilisearch的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter全文搜索引擎插件meilisearch的使用

Meilisearch是一个开源的搜索引擎,Meilisearch Dart SDK允许Dart和Flutter开发者轻松集成该搜索引擎到他们的应用中。本文将介绍如何在Flutter项目中使用Meilisearch。

Table of Contents

🔧 Installation

首先,在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  meilisearch: ^0.16.0

然后运行以下命令更新依赖包:

flutter pub get

Run Meilisearch

你可以通过多种方式下载和运行Meilisearch实例。例如,使用curl命令:

# Install Meilisearch
curl -L https://install.meilisearch.com | sh

# Launch Meilisearch
./meilisearch --master-key=masterKey

你也可以从Homebrew、APT或者使用Docker来运行Meilisearch。

🚀 Getting started

Add Documents

以下是添加文档的示例代码:

import 'package:meilisearch/meilisearch.dart';

void main() async {
  var client = MeiliSearchClient('http://127.0.0.1:7700', 'masterKey');

  // 创建一个索引
  var index = client.index('movies');

  const documents = [
    { 'id': 1, 'title': 'Carol', 'genres': ['Romance', 'Drama'] },
    { 'id': 2, 'title': 'Wonder Woman', 'genres': ['Action', 'Adventure'] },
    { 'id': 3, 'title': 'Life of Pi', 'genres': ['Adventure', 'Drama'] },
    { 'id': 4, 'title': 'Mad Max: Fury Road', 'genres': ['Adventure', 'Science Fiction'] },
    { 'id': 5, 'title': 'Moana', 'genres': ['Fantasy', 'Action']},
    { 'id': 6, 'title': 'Philadelphia', 'genres': ['Drama'] },
  ];

  // 添加文档
  var task = await index.addDocuments(documents);
}

Basic Search

基本搜索示例:

var result = await index.search('carlo');
print(result.hits);

JSON输出:

[
  {
    "id": 1,
    "title": "Carol",
    "genres": ["Romance", "Drama"]
  }
]

Custom Search

自定义搜索示例:

var result = await index.search(
  'carol',
  attributesToHighlight: ['title'],
);

print(result.hits);

JSON输出:

{
  "hits": [
    {
      "id": 1,
      "title": "Carol",
      "_formatted": {
        "id": 1,
        "title": "<em>Carol</em>"
      }
    }
  ],
  "offset": 0,
  "limit": 20,
  "processingTimeMs": 0,
  "query": "carol"
}

Custom Search With Filters

启用过滤器的自定义搜索示例:

await index.updateFilterableAttributes(['id', 'genres']);
await index.search('wonder', filter: ['id > 1 AND genres = Action']);

JSON输出:

{
  "hits": [
    {
      "id": 2,
      "title": "Wonder Woman",
      "genres": ["Action","Adventure"]
    }
  ],
  "offset": 0,
  "limit": 20,
  "estimatedTotalHits": 1,
  "processingTimeMs": 0,
  "query": "wonder"
}

Advanced Configuration

Customizing the dio instance

你可以使用dio库自定义请求拦截器或适配器:

// 使用自定义的dio实例
final customDio = Dio();
final client = MeiliSearchClient.withCustomDio('http://127.0.0.1:7700', 'masterKey', customDio);

Using MeiliDocumentContainer

使用MeiliDocumentContainer<T>类可以快速获取Meilisearch特定字段:

final res = await index 
      .search("hello world") 
      .asSearchResult() // 或者使用.asPaginatedResult() 如果使用分页参数
      .mapToContainer(); 

🤖 Compatibility with Meilisearch

该SDK兼容Meilisearch v1.x版本,但不支持v1.6.0及更高版本中的实验性功能vectorStore

💡 Learn more

更多详细信息请参考Meilisearch官方文档:


希望以上内容能帮助你在Flutter项目中成功集成和使用Meilisearch!


更多关于Flutter全文搜索引擎插件meilisearch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter全文搜索引擎插件meilisearch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用MeiliSearch作为全文搜索引擎的示例代码。MeiliSearch 是一个强大、快速、开源、易于使用的搜索引擎,非常适合与Flutter集成。

首先,你需要确保你的Flutter项目已经设置好,并且你有MeiliSearch实例运行。如果你还没有MeiliSearch实例,你可以按照官方文档进行安装和启动。

1. 添加依赖

在你的pubspec.yaml文件中添加meilisearch依赖:

dependencies:
  flutter:
    sdk: flutter
  meilisearch: ^0.10.0 # 确保使用最新版本,版本号可能会有更新

然后运行flutter pub get来安装依赖。

2. 初始化MeiliSearch客户端

创建一个Dart文件(例如meilisearch_client.dart)来初始化MeiliSearch客户端:

import 'package:meilisearch/meilisearch.dart';

class MeiliSearchClient {
  late Client client;

  MeiliSearchClient({required String url, required String apiKey}) {
    client = Client(url, apiKey);
  }

  Future<Index> getIndex(String indexName) async {
    return client.index(indexName);
  }

  Future<Index> createIndex(String indexName) async {
    return client.createIndex(indexName);
  }
}

3. 在Flutter应用中使用MeiliSearch

接下来,在你的Flutter应用中使用这个客户端。例如,在main.dart中:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late MeiliSearchClient meiliSearchClient;
  late Index index;
  List<Map<String, dynamic>> searchResults = [];

  @override
  void initState() {
    super.initState();
    meiliSearchClient = MeiliSearchClient(
      url: 'http://localhost:7700', // 替换为你的MeiliSearch实例的URL
      apiKey: 'your_api_key', // 替换为你的MeiliSearch API密钥
    );

    _initializeIndex();
  }

  Future<void> _initializeIndex() async {
    index = await meiliSearchClient.createIndex('movies');

    // 添加一些文档(示例数据)
    await index.addDocuments([
      {
        'id': 1,
        'title': 'Inception',
        'genre': 'Sci-Fi',
      },
      {
        'id': 2,
        'title': 'The Matrix',
        'genre': 'Sci-Fi',
      },
      {
        'id': 3,
        'title': 'The Shawshank Redemption',
        'genre': 'Drama',
      },
    ]);

    // 等待索引更新完成
    await index.waitForPendingUpdate();
  }

  Future<void> _search(String query) async {
    var results = await index.search(query);
    setState(() {
      searchResults = results.hits;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MeiliSearch Demo'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            children: [
              TextField(
                decoration: InputDecoration(
                  labelText: 'Search',
                ),
                onChanged: (query) {
                  _search(query);
                },
              ),
              SizedBox(height: 16),
              Expanded(
                child: searchResults.isEmpty
                    ? Center(child: Text('No results'))
                    : ListView.builder(
                        itemCount: searchResults.length,
                        itemBuilder: (context, index) {
                          var result = searchResults[index];
                          return ListTile(
                            title: Text(result['title'] as String),
                            subtitle: Text(result['genre'] as String),
                          );
                        },
                      ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 运行应用

确保你的MeiliSearch实例正在运行,然后运行你的Flutter应用。你应该能够看到一个简单的搜索界面,你可以在其中输入查询词并看到搜索结果。

这个示例展示了如何在Flutter应用中集成MeiliSearch,包括初始化客户端、创建索引、添加文档和执行搜索。你可以根据需要扩展这个示例,例如添加错误处理、优化搜索结果显示等。

回到顶部