MeiliSearch 0.15.0

dotnet add package MeiliSearch --version 0.15.0
NuGet\Install-Package MeiliSearch -Version 0.15.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MeiliSearch" Version="0.15.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add MeiliSearch --version 0.15.0
#r "nuget: MeiliSearch, 0.15.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install MeiliSearch as a Cake Addin
#addin nuget:?package=MeiliSearch&version=0.15.0

// Install MeiliSearch as a Cake Tool
#tool nuget:?package=MeiliSearch&version=0.15.0

<p align="center"> <img src="https://raw.githubusercontent.com/meilisearch/integration-guides/main/assets/logos/meilisearch_dotnet.svg" alt="Meilisearch-Dotnet" width="200" height="200" /> </p>

<h1 align="center">Meilisearch .NET</h1>

<h4 align="center"> <a href="https://github.com/meilisearch/meilisearch">Meilisearch</a> | <a href="https://www.meilisearch.com/cloud?utm_campaign=oss&utm_source=github&utm_medium=meilisearch-dotnet">Meilisearch Cloud</a> | <a href="https://www.meilisearch.com/docs">Documentation</a> | <a href="https://discord.meilisearch.com">Discord</a> | <a href="https://roadmap.meilisearch.com/tabs/1-under-consideration">Roadmap</a> | <a href="https://www.meilisearch.com">Website</a> | <a href="https://www.meilisearch.com/docs/faq">FAQ</a> </h4>

<p align="center"> <a href="https://www.nuget.org/packages/meilisearch"><img src="https://img.shields.io/nuget/v/meilisearch" alt="NuGet"></a> <a href="https://github.com/meilisearch/meilisearch-dotnet/actions"><img src="https://github.com/meilisearch/meilisearch-dotnet/workflows/Tests/badge.svg?branch=main" alt="GitHub Workflow Status"></a> <a href="https://github.com/meilisearch/meilisearch-dotnet/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-informational" alt="License"></a> <a href="https://ms-bors.herokuapp.com/repositories/63"><img src="https://bors.tech/images/badge_small.svg" alt="Bors enabled"></a> </p>

<p align="center">⚡ The Meilisearch API client written for .NET</p>

Meilisearch .NET is the Meilisearch API client for C# developers.

Meilisearch is an open-source search engine. Learn more about Meilisearch.

Table of Contents

📖 Documentation

This readme contains all the documentation you need to start using this Meilisearch SDK.

For general information on how to use Meilisearch—such as our API reference, tutorials, guides, and in-depth articles—refer to our main documentation website.

⚡ Supercharge your Meilisearch experience

Say goodbye to server deployment and manual updates with Meilisearch Cloud. Get started with a 14-day free trial! No credit card required.

🔧 Installation

This package targets .NET Standard 2.1.

Using the .NET Core command-line interface (CLI) tools:

dotnet add package MeiliSearch

or with the Package Manager Console:

Install-Package MeiliSearch

Run Meilisearch

There are many easy ways to download and run a Meilisearch instance.

For example, using the curl command in your Terminal:

# Install Meilisearch
curl -L https://install.meilisearch.com | sh
# Launch Meilisearch
./meilisearch --master-key=masterKey

NB: you can also download Meilisearch from Homebrew or APT or even run it using Docker.

🚀 Getting started

Add Documents
using System;
using System.Threading.Tasks;
using Meilisearch;

namespace GettingStarted
{
    class Program
    {
        public class Movie
        {
            public string Id { get; set; }
            public string Title { get; set; }
            public IEnumerable<string> Genres { get; set; }
        }

        static async Task Main(string[] args)
        {
            MeilisearchClient client = new MeilisearchClient("http://localhost:7700", "masterKey");

            // An index is where the documents are stored.
            var index = client.Index("movies");
            var documents = new Movie[] {
                new Movie { Id = "1", Title = "Carol", Genres = new string[] { "Romance", "Drama" }  },
                new Movie { Id = "2", Title = "Wonder Woman", Genres = new string[] { "Action", "Adventure" } },
                new Movie { Id = "3", Title = "Life of Pi", Genres = new string[] { "Adventure", "Drama" } },
                new Movie { Id = "4", Title = "Mad Max: Fury Road", Genres = new string[] { "Adventure", "Science Fiction"} },
                new Movie { Id = "5", Title = "Moana", Genres = new string[] { "Fantasy", "Action" } },
                new Movie { Id = "6", Title = "Philadelphia", Genres = new string[] { "Drama" } }
            };

            // If the index 'movies' does not exist, Meilisearch creates it when you first add the documents.
            var task = await index.AddDocumentsAsync<Movie>(documents); // # => { "uid": 0 }
        }
    }
}

With the uid, you can check the status (enqueued, canceled, processing, succeeded or failed) of your documents addition using the task.

# Meilisearch is typo-tolerant:
SearchResult<Movie> movies = await index.SearchAsync<Movie>("philadalphia");
foreach(var prop in movies.Hits) {
    Console.WriteLine (prop.Title);
}

JSON Output:

{
    "hits": [
        {
            "id": 6,
            "title": "Philadelphia",
        }
    ],
    "offset": 0,
    "limit": 20,
    "processingTimeMs": 10,
    "query": "philadalphia"
}

All the supported options are described in the search parameters section of the documentation.

SearchResult<Movie> movies = await index.SearchAsync<Movie>(
    "car",
    new SearchQuery
    {
        AttributesToHighlight = new string[] { "title" },
    }
);

foreach(var prop in movies.Hits) {
    Console.WriteLine (prop.Title);
}

JSON Output:

{
    "hits": [
        {
            "id": 1,
            "title": "Carol",
            "_formatted": {
                "id": 1,
                "title": "<em>Car</em>ol"
            }
        }
    ],
    "offset": 0,
    "limit": 20,
    "processingTimeMs": 10,
    "query": "car"
}
Custom Search With Filters

If you want to enable filtering, you must add your attributes to the FilterableAttributes index setting.

TaskInfo task = await index.UpdateFilterableAttributesAsync(
    new string[] { "id", "genres" }
);

You only need to perform this operation once.

Note that MeiliSearch will rebuild your index whenever you update FilterableAttributes. Depending on the size of your dataset, this might take time. You can track the process using the update status.

Then, you can perform the search:

SearchResult<Movie> movies = await index.SearchAsync<Movie>(
    "wonder",
    new SearchQuery
    {
        Filter = "id > 1 AND genres = Action",
    }
);

JSON Output:

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

🤖 Compatibility with Meilisearch

This package guarantees compatibility with version v1.x of Meilisearch, but some features may not be present. Please check the issues for more info.

🎬 Examples

Indexes

Create an index
var index = await client.CreateIndexAsync("movies");
Create an index and give the primary-key
var index = await client.CreateIndexAsync("movies", "id");
List all an index
var indexes = await client.GetAllIndexesAsync();
Get an Index object
var index = await client.GetIndexAsync("movies");

Documents

Add or Update Documents
var task = await index.AddDocumentsAsync(new Movie[] { new Movie { Id = "1", Title = "Carol" } } );
var task = await index.UpdateDocumentsAsync(new Movie[] { new Movie { Id = "1", Title = "Carol" } } );

The returned task is a TaskInfo that can access to Uid to get the status of the task.

Get Documents
var documents = await index.GetDocumentsAsync<Movie>(new DocumentsQuery { Limit = 1 });
Get Document by Id
var document = await index.GetDocumentAsync<Movie>("10");
Delete documents
var task = await index.DeleteOneDocumentAsync("11");
Delete in Batch
var task = await index.DeleteDocumentsAsync(new [] {"12","13","14"});
Delete all documents
var task = await indextoDelete.DeleteAllDocumentsAsync();

Get Task information

Get one Task By Uid
TaskInfo task = await index.GetTaskAsync(1);
// Or
TaskInfo task = await client.GetTaskAsync(1);
Get All Tasks
var task = await index.GetTasksAsync();
// Or
var task = await client.GetTasksAsync();
Basic Search
var movies = await this.index.SearchAsync<Movie>("prince");
Custom Search
var movies = await this.index.SearchAsync<Movie>("prince", new SearchQuery { Limit = 100 });

🧰 Use a Custom HTTP Client

You can replace the default client used in this package by the one you want.

For example:

var _httpClient = ClientFactory.Instance.CreateClient<MeilisearchClient>();
var client = new MeilisearchClient(_httpClient);

Where ClientFactory is declared like this.

⚙️ Contributing

Any new contribution is more than welcome in this project!

If you want to know more about the development workflow or want to contribute, please visit our contributing guidelines for detailed instructions!

<hr>

Meilisearch provides and maintains many SDKs and Integration tools like this one. We want to provide everyone with an amazing search experience for any kind of project. If you want to contribute, make suggestions, or just know what's going on right now, visit us in the integration-guides repository.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on MeiliSearch:

Package Downloads
Pina.MeiliSearch

Package Description

FluentSearchEngine

Fluent API that works as a wrapper for MeiliSearch, providing fluent filtration, sorting and pagination

Chaosage.Core.Search.Meili

Chaosage开发平台MeiliSearch操作库

JustSearch.MeiliSearch

Package Description

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on MeiliSearch:

Repository Stars
zoriya/Kyoo
A portable and vast media library solution.
Version Downloads Last updated
0.15.0 2,824 3/11/2024
0.14.7 8,960 1/17/2024
0.14.6 8,897 10/25/2023
0.14.5 840 10/12/2023
0.14.4 1,341 9/25/2023
0.14.3 12,101 7/11/2023
0.14.2 10,899 5/8/2023
0.14.1 14,938 4/3/2023
0.14.0 2,897 3/16/2023
0.13.1 4,959 2/6/2023
0.13.0 12,285 12/5/2022
0.12.1 9,089 11/8/2022
0.12.0 3,934 10/3/2022
0.11.0 6,812 8/1/2022
0.10.2 4,540 5/18/2022
0.10.1 3,031 3/14/2022
0.10.0 1,805 2/16/2022
0.9.0 970 1/25/2022
0.8.0 2,010 11/18/2021
0.7.2 618 10/13/2021
0.7.1 1,901 9/13/2021
0.7.0 591 8/23/2021
0.6.1 949 6/11/2021
0.6.0 2,248 5/25/2021
0.5.0 336 5/24/2021
0.4.2 7,085 4/14/2021
0.4.1 1,020 12/8/2020
0.4.0 855 11/4/2020
0.3.2 290 10/14/2020
0.3.1 378 9/30/2020
0.3.0 360 8/13/2020
0.2.2 284 8/3/2020
0.2.1 269 7/7/2020
0.2.0 281 7/3/2020
0.1.0 365 6/24/2020