当前位置: 首页 > article >正文

Meilisearch ASP.Net Core API 功能demo

  1. 安装
MeiliSearch                 0.15.5   0.15.5
  1. demo code
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


http://www.kler.cn/a/500915.html

相关文章:

  • 自动化测试脚本实践:基于 Bash 的模块化测试框架
  • 基于Springboot美食推荐商城系统【附源码】
  • 14. 以太网接口
  • linux-28 文本管理(一)文本查看,cat,tac,more,less,head,tail
  • Nginx 配置支持 HTTPS 代理
  • 计算机类-数据结构课程推荐
  • 《拉依达的嵌入式\驱动面试宝典》—操作系统篇(一)
  • Maven 仓库的分类
  • Cisco认证是Cisco公司建立的网络技术证书体系
  • C#解决浮点数精度丢失的问题(参考方案)
  • [DO374] Ansible 配置文件
  • 云服务器加了安全组端口还是无法访问
  • 一分钟学会文心一言API如何接入,文心一言API接入教程
  • 基于 JavaEE 的影视创作论坛
  • fitz获取pdf内容
  • 浅谈云计算04 | 云基础设施机制
  • 游戏引擎学习第78天
  • SmartScanner:智能化网络漏洞扫描的未来先锋
  • RAID储存技术
  • [创业之路-242]:《华为双向指挥系统》-1-组织再造-纠正企业管理的长短腿-科层制优缺点以及科层制企业的特点