Meilisearch ASP.Net Core API 功能demo

news2025/1/9 22:16:54
  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.coloradmin.cn/o/2274030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【优选算法】Binary-Blade:二分查找的算法刃(下)

文章目录 1.山脉数组的峰顶索引2.寻找峰值3.寻找旋转排序数组中的最小值4.点名希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 本篇接上一篇二分查找&#xff0c;主要通过部分题目熟悉二分查找的进阶使用&#xff0c;重点强调二段性&#xff0c;…

【Ubuntu22.04】VMware虚拟机硬盘扩容

1.首先打开虚拟机设置 2.根据需要对硬盘扩展 这边提示我们还需要进入虚拟机在内部分区 3.安装界面化磁盘管理工具 # 安装 sudo apt install gparted# 启动 sudo gparted调整硬盘大小 调整的时候会提示我们硬盘是只读的&#xff0c;因此还要进行操作 新建终端重新挂载文件系…

无网络时自动切换备用网络环境

目录 背景目标为什么需要做自动网络切换网络切换手段 网络环境实现思路和代码部署脚本开机自动执行附录连接两个网络时的路由问题 背景 目标 学校实验室有两个网络环境&#xff0c;我电脑使用网线连接稳定但低速的网络A&#xff0c;使用WiFi连接高速但不稳定的网络B。因此&am…

设计模式 行为型 策略模式(Strategy Pattern)与 常见技术框架应用 解析

策略模式&#xff08;Strategy Pattern&#xff09;核心思想是将算法的实现从使用该算法的类中分离出来&#xff0c;作为独立的对象&#xff0c;通过接口来定义算法家族&#xff0c;这样就可以很容易地改变或扩展算法。通过这种方式&#xff0c;可以避免在客户端代码中使用大量…

Unity 热更新基础知识

文章目录 1.一些名词2.三种编译方式3.Unity 两种脚本后端3.1 Mono3.2 IL2CPP3.3 对比 1.一些名词 IL&#xff08;Intermediate Language&#xff09;&#xff1a;中间语言&#xff08;类似于汇编代码&#xff09;CIL&#xff08;Common Intermediate Language&#xff09;&…

C++感受15-Hello STL 泛型启蒙

生鱼片和STL的关系&#xff0c;你听过吗&#xff1f;泛型编程和面向对象编程&#xff0c;它们打架吗&#xff1f;行为泛型和数据泛型&#xff0c;各自的目的是&#xff1f; 0 楔 俄罗斯生鱼片&#xff0c;号称俄罗斯版的中国烤鸭&#xff0c;闻名于世。其鱼肉&#xff0c;源于…

LabVIEW轴承性能测试系统

本文介绍了基于LabVIEW的高效轴承性能测试系统的设计与开发。系统通过双端驱动技术实现高精度同步控制&#xff0c;针对轴承性能进行全面的测试与分析&#xff0c;以提高轴承的可靠性和寿命。 项目背景 随着工业自动化程度的提高&#xff0c;对轴承的性能要求越来越高。传统的…

(k8s)Flannel Error问题解决!

1.问题描述 书接上回&#xff0c;我们在解决kubectl不断重启的时候引入了Flannel 网络插件&#xff0c;但是一上来就报错&#xff0c; 2.问题解决 自己的思路&#xff1a;照例开始检查 1.先检查一下目前Flannel的pod kubectl get pods --all-namespaces 2.检查 Flannel的po…

CatLog的使用

一 CatLog的简介 1.1 作用 CAT&#xff08;Central Application Tracking&#xff09; 是基于 Java 开发的实时应用监控平台&#xff0c;为美团点评提供了全面的实时监控告警服务。 1.2 组成部分 1.2.1 Transaction 1.Transaction 适合记录跨越系统边界的程序访问行为&a…

深入Android架构(从线程到AIDL)_18 SurfaceView的UI多线程02

目录 2、 使用SurfaceView画2D图 范例一 设计GameLoop(把小线程移出来) 范例二 2、 使用SurfaceView画2D图 范例一 以SurfaceView绘出Bitmap图像设计SpriteView类别来实作SurfaceHolder.Callback接口首先来看个简单的程序&#xff0c;显示出一个Bitmap图像。这个图像就构…

【FlutterDart】 拖动边界线改变列宽类似 vscode 那种拖动改变编辑框窗口大小(11 /100)

【Flutter&Dart】 拖动改变 widget 的窗口尺寸大小GestureDetector&#xff5e;简单实现&#xff08;10 /100&#xff09; 【Flutter&Dart】 拖动边界线改变列宽并且有边界高亮和鼠标效果&#xff08;12 /100&#xff09; 上效果&#xff1a; 这个在知乎里找到的效果&…

tk GMV MAX素材范围投放指南

Product GMy Max素材范围说明 Product GMy Max能自动获取带有相关商品锚点链接&#xff08;无论是单个锚点还是多个锚点&#xff09;的视频&#xff0c;并将其用于推广特定商品的广告素材&#xff0c;前提是这些视频已经获得广告授权。然而&#xff0c;请注意&#xff0c;多个…

物联网无线芯片模组方案,设备智能化交互升级,ESP32-C3控制应用

无线交互技术的核心在于实现设备之间的无缝连接和数据传输。在智能家居系统中&#xff0c;各种智能设备如智能灯泡、智能插座、智能门锁等&#xff0c;都通过无线网络相互连接&#xff0c;形成一个互联互通的生态。 用户可以通过语音助手、手机APP或其他智能终端&#xff0c;远…

ubuntu为Docker配置代理

终端代理 我们平常在ubuntu终端中使用curl或git命令时&#xff0c;往往会很慢。 所以&#xff0c;首先需要给ubuntu终端环境添加代理。 查看自身那个软件的端口号&#xff0c;我这里是7890。 sudo gedit ~/.bashrcexport http_proxyhttp://localhost:7890 export https_pr…

【VUE 指令学习笔记】

v-bind :单向绑定解析表达式&#xff0c;可简写为:xxx v-model :双向数据绑定。 v-for&#xff1a;遍历数组/对象/字符串 v-on&#xff1a;绑定事件监听&#xff0c;可简写为。 v-if:条件渲染(动态控制节点是否存存在) v-else:条件渲染(动态控制节点是否存存在) v-show:条件渲染…

用OpenCV实现UVC视频分屏

分屏 OpencvUVC代码验证后话 用OpenCV实现UVC摄像头的视频分屏。 Opencv opencv里有很多视频图像的处理功能。 UVC Usb 视频类&#xff0c;免驱动的。视频流格式有MJPG和YUY2。MJPG是RGB三色通道的。要对三通道进行分屏显示。 代码 import cv2 import numpy as np video …

123.【C语言】数据结构之快速排序挖坑法和前后指针法

目录 1.挖坑法 执行流程 代码 运行结果 可读性好的代码 2.前后指针法(双指针法) 执行流程 单趟排序代码 将单趟排序代码改造后 写法1 简洁的写法 3.思考题 1.挖坑法 执行流程 "挖坑法"顾名思义:要有坑位,一开始将关键值放入临时变量key中,在数组中形成…

JavaFx 21 项目Markdown 预览、编辑、新建、文件树、删除、重命名

项目文件结构 项目的源代码和资源文件存放在以下路径: 源代码: src/main/java/com/kong/markdown/ 包含多个 Java 文件,主要实现了应用的功能: App.java:主类,可能包含应用的启动逻辑。FileService.java:可能与文件操作相关的服务类。MainController.java:控制器类,可…

jenkins入门6 --拉取代码

Jenkins代码拉取 需要的插件&#xff0c;缺少的安装下 新建一个item,选择freestyle project 源码管理配置如下&#xff1a;需要添加git库地址&#xff0c;和登录git的用户密码 配置好后执行编译&#xff0c;成功后拉取的代码在工作空间里

数学建模入门——建模流程

摘要&#xff1a;本文介绍了数学建模的一般流程概述。 目录 一、前言 二、数据预处理 三、描述性统计分析 四、模型建立 五、模型评价 一、前言 本文将为想要入门数学建模的同学讲述数学建模的一般流程。但数学建模流程并非一成不变。虽有大致步骤&#xff0c;像分析问题、…