Meilisearch ASP.Net Core API 功能demo

  1. 安装
bash 复制代码
MeiliSearch                 0.15.5   0.15.5
  1. demo code
csharp 复制代码
using Meilisearch;
using System.Data;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace MeiliSearchAPI
{
    public class MeilisearchHelper
    {
        public MeilisearchHelper()
        {
            DefaultClient = new MeilisearchClient(MeilisearchAddress(), ApiKey);
            var httpClient = new HttpClient(new MeilisearchMessageHandler(new HttpClientHandler())) { BaseAddress = new Uri(MeilisearchAddress()) };
            ClientWithCustomHttpClient = new MeilisearchClient(httpClient, ApiKey);
        }


        private const string ApiKey = "ellisniubitesthahaha";
        private static readonly string BasePath = Path.Combine(Directory.GetCurrentDirectory(), "Datasets");
        public static readonly string SmallMoviesJsonPath = Path.Combine(BasePath, "small_movies.json");

        public virtual string MeilisearchAddress()
        {
            return "http://192.168.214.133:31170";
        }

        public MeilisearchClient DefaultClient { get; private set; }
        public MeilisearchClient ClientWithCustomHttpClient { get; private set; }


        /// <summary>
        /// 从json文件插入document
        /// </summary>
        /// <returns></returns>
        public async Task InitIndexWithValue(string indexName)
        {
            var index = DefaultClient.Index(indexName);

            var jsonDocuments = await File.ReadAllTextAsync(SmallMoviesJsonPath);
            var task = await index.AddDocumentsJsonAsync(jsonDocuments);
            await index.WaitForTaskAsync(task.TaskUid);
        }
        /// <summary>
        /// 根据类插入document
        /// </summary>
        /// <param name="datasetSmallMovies"></param>
        /// <returns></returns>

        public async Task<TaskInfo> InsertDocument<T>(List<T> datasetSmallMovies,string indexName)
        {
            var index = DefaultClient.Index(indexName);
            var task = await index.AddDocumentsAsync<T>(datasetSmallMovies);
            return task;
        }

        /// <summary>
        /// 基本查询
        /// </summary>
        /// <param name="searchText"></param>
        /// <returns></returns>
        public async Task<List<T>> BasicSearch<T>(string searchText,string indexName)
        {
            var index = DefaultClient.Index(indexName);
            ISearchable<T> movies = await index.SearchAsync<T>(searchText);
            return movies.Hits.ToList();
        }


        /// <summary>
        /// 高亮基本查询
        /// </summary>
        /// <param name="searchText"></param>
        /// <returns></returns>
        public async Task<List<T>> HighlightBasicSearch<T>(string searchText,string indexName)
        {
            var index = DefaultClient.Index(indexName);
            ISearchable<T> movies = await index.SearchAsync<T>(searchText,new SearchQuery
            {
                //AttributesToHighlight = new string[] { "title" },
                AttributesToHighlight = ["*"],
                HighlightPreTag = "<ellis>",
                HighlightPostTag = "</ellis>"
            });
            return movies.Hits.ToList();
        }

        /// <summary>
        /// 设置搜索字段,设置filter字段
        /// </summary>
        /// <returns></returns>
        public async Task<TaskInfo> UpdateIndexConfig()
        {
            var index = DefaultClient.Index("small_movies");


            return await index.UpdateSettingsAsync(new Settings()
            {
                FilterableAttributes = new string[] { "id", "release_date" },
                SearchableAttributes = new string[] { "title" },
                DisplayedAttributes = new string[] { "title", "release_date", "id" , "poster", "overview", "genre" }
            });
        }
        /// <summary>
        /// query 以及filter
        /// </summary>
        /// <returns></returns>
        public async Task<List<DatasetSmallMovie>> QueryByFilter()
        {
            var index = DefaultClient.Index("small_movies");
            return index.SearchAsync<DatasetSmallMovie>("", new SearchQuery()
            {
                Filter = "id=338952 AND release_date=1542153600",
                Limit = 10,
                Offset = 0
            }).Result.Hits.ToList();
        }

        /// <summary>
        /// 创建索引的同时指定主键字段
        /// </summary>
        /// <param name="indexName"></param>
        /// <param name="primaryKey"></param>
        /// <returns></returns>
        public async Task<TaskInfo> CreateIndex(string indexName,string primaryKey)
        {
            return await DefaultClient.CreateIndexAsync(indexName, primaryKey);
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <returns></returns>
        public async Task<TaskInfo> UpdateDocumentByID()
        {
            var index = DefaultClient.Index("small_movies");
            return await index.UpdateDocumentsAsync(new DatasetSmallMovie[] { new DatasetSmallMovie() { Id = "1", Title = "just do it" ,ReleaseDate=DateTime.Now} });
        }

        /// <summary>
        /// 根据ID查询
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<T> GetByID<T>(string id,string indexName)
        {
            var index = DefaultClient.Index(indexName);
            return await index.GetDocumentAsync<T>(id);
        }

        public async Task<TaskInfo> DeleteDocuments(string[] ids,string indexName)
        {
            var index = DefaultClient.Index(indexName);
            return await index.DeleteDocumentsAsync(ids);
        }
    }

    public class BaseClass
    {
        public string Id { get; set; }
    }
    public class DatasetSmallMovie:BaseClass
    {
        
        public string Title { get; set; }
        public string Poster { get; set; }
        public string Overview { get; set; }
        [JsonPropertyName("release_date")]
        [JsonConverter(typeof(UnixEpochDateTimeConverter))]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }

    }

    //高亮查询使用

    public class FormattedSmallMovie
    {
        public string Id { get; set; }
        public string Title { get; set; }
        public string Poster { get; set; }
        public string Overview { get; set; }
        [JsonPropertyName("release_date")]
        [JsonConverter(typeof(UnixEpochDateTimeConverter))]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }

        public DatasetSmallMovie _Formatted { get; set; }
    }


    sealed class UnixEpochDateTimeConverter : JsonConverter<DateTime>
    {
        static readonly DateTime s_epoch = new DateTime(1970, 1, 1, 0, 0, 0);

        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.String)
            {
                string stringValue = reader.GetString();
                var unixTime = Convert.ToInt64(stringValue);
                return s_epoch.AddMilliseconds(unixTime);
            }
            else
            {
                var unixTime = reader.GetInt64();
                return s_epoch.AddMilliseconds(unixTime);
            }

           
        }

        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
        {
            var unixTime = Convert.ToInt64((value - s_epoch).TotalMilliseconds);
            writer.WriteNumberValue(unixTime);
        }
    }
}

官网
源码
https://www.meilisearch.com/docs/reference/api/search

https://github.com/meilisearch/meilisearch-dotnet/issues/315

相关推荐
码农君莫笑25 分钟前
Blazor用户身份验证状态详解
服务器·前端·microsoft·c#·asp.net
Archy_Wang_12 小时前
ASP.NET Core 实现微服务 -- Polly 服务降级熔断
后端·微服务·asp.net
Damon小智6 小时前
C#进阶-在Ubuntu上部署ASP.NET Core Web API应用
linux·nginx·c#·asp.net·.net·.net core
小禾家的6 小时前
asp.net core webapi 并发请求时 怎么保证实时获取的用户信息是此次请求的?
后端·asp.net
Libby博仙6 小时前
asp.net core mvc中的模板页(父页面,布局页)和部分视图(Partial View)
后端·asp.net·mvc
是萝卜干呀6 小时前
Backend - C# asp .net core
asp.net·.netcore·middleware·wwwroot·appsettings
Q_19284999063 天前
基于ASP.NET的动漫网站
后端·asp.net
csdn_aspnet3 天前
在 ASP.NET CORE 中上传、下载文件
后端·asp.net·.netcore
忧郁的蛋~3 天前
C#数据库操作系列---SqlSugar完结篇
数据库·c#·asp.net