记一次Meilisearch轻量级搜索引擎使用

news/2024/9/23 9:03:33 标签: 搜索引擎, Meilisearch, java

以前使用的是mysql的全文索引、最开始还行。后续觉得就不好用了,但是服务器资源有限,没法上ES,只好找一个轻量级的搜索引擎、找了半天,决定使用这一个,目前效果还不错的。

参考网址
官网:https://www.meilisearch.com/docs/reference/api/overview
java第三方sdk:https://github.com/meilisearch/meilisearch-java/issues

0、docker安装 很快的

安装好你可以通过 host:7700打开web页面

1、客户端的创建

java">package xxx.x.x;

import cn.hutool.core.util.ObjectUtil;
import com.meilisearch.sdk.Client;
import com.meilisearch.sdk.Config;
import com.meilisearch.sdk.json.JacksonJsonHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class MeilisearchConfig {
	
	@Value("${meilisearch.url:http://127.0.01:7700}")
	private String meilisearchUrl;
	@Value("${meilisearch.masterKey:}")
	private String masterKey = "masterKey";
	
	private volatile Client client;
	
	/**
	 * 获取 MeiliSearch 客户端
	 *
	 * @return
	 */
	public Client getClient() {
		if (ObjectUtil.isNull(client)) {
			synchronized (this) {
				if (ObjectUtil.isNull(client)) {
					client = buildClient();
				}
			}
		}
		return client;
	}
	
	/**
	 * 构建 MeiliSearch 客户端
	 *
	 * @return
	 */
	public Client buildClient() {
		Config config = new Config(meilisearchUrl, masterKey, new JacksonJsonHandler());
		client = new Client(config);
		log.info("MeiliSearch Client 初始化完成");
		return client;
	}
	
}

2、简单工具类

java">package xxx.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.meilisearch.sdk.Client;
import com.meilisearch.sdk.Index;
import com.meilisearch.sdk.model.TaskInfo;
import top.shareus.bot.common.eumn.meilisearch.MeilisearchIndexEnums;

import java.util.List;

public class MeilisearchUtil {
	
	private final static Log log = LogFactory.getCurrentLogFactory().getLog(MeilisearchUtil.class);
	
	/**
	 * 添加文档
	 *
	 * @param meilisearchClient
	 * @param indexEnums
	 * @param objList
	 * @param <T>
	 */
	public static <T> void addDocuments(Client meilisearchClient, MeilisearchIndexEnums indexEnums, List<T> objList) {
		if (ObjectUtil.hasNull(meilisearchClient, indexEnums) || CollUtil.isEmpty(objList)) {
			return;
		}
		log.info("-----------------------------------------------------");
		
		JSONArray array = new JSONArray();
		
		List<JSONObject> objectList = objList.stream().map(JSONObject::new).toList();
		log.info("待添加文档数量: {}", objectList.size());
		
		array.put(objectList);
		String documents = array.getJSONArray(0).toString();
		
		Index index = meilisearchClient.index(indexEnums.getIndex());
		
		String primaryKey = indexEnums.getPrimaryKey();
		TaskInfo taskInfo;
		if (StrUtil.isBlank(primaryKey)) {
			taskInfo = index.addDocuments(documents);
		} else {
			taskInfo = index.addDocuments(documents, primaryKey);
		}
		
		log.info("添加文档任务ID: {}", taskInfo.getTaskUid());
		log.info("添加文档任务状态: {}", taskInfo.getStatus());
		log.info("添加文档任务信息:{}", JSONUtil.toJsonStr(taskInfo));
		
		log.info("添加文档任务结果:{}", JSONUtil.toJsonStr(index.getTask(taskInfo.getTaskUid())));
		log.info("-----------------------------------------------------");
	}
	
	/**
	 * 删除索引
	 *
	 * @param meilisearchClient
	 * @param indexEnums
	 */
	public static void delIndex(Client meilisearchClient, MeilisearchIndexEnums indexEnums) {
		if (ObjectUtil.hasNull(meilisearchClient, indexEnums)) {
			return;
		}
		meilisearchClient.deleteIndex(indexEnums.getIndex());
	}
}

3、练手的单元测试、索引创建、简单查询

主要用户对索引的创建、及简单的查询

java">		Client meilisearchClient = meilisearchConfig.getClient();
		Index index = meilisearchClient.index(MeilisearchIndexEnums.ARCHIVED_FILE.getIndex());
		meilisearchClient.deleteIndex(MeilisearchIndexEnums.ARCHIVED_FILE.getIndex());
		// 这里记得 每次创建索引 需要重新把你的一些筛选字段和排序字段重新添加一下
		TaskInfo taskInfo = index.updateFilterableAttributesSettings(new String[]{"name", "delFlag", "enabled", "archiveDate"});
		taskInfo = index.updateSortableAttributesSettings(new String[]{"archiveDate"});
		List<ArchivedFile> archivedFileList = archivedFileService.list();
		MeilisearchUtil.addDocuments(meilisearchClient, MeilisearchIndexEnums.ARCHIVED_FILE, archivedFileList);
		
		SearchRequest searchRequest = SearchRequest.builder()
				.limit(10)
				.page(1)
				.hitsPerPage(10)
				.sort(new String[]{"archiveDate:desc"})
				.showRankingScore(true)
				.attributesToSearchOn(new String[]{"name"})
				.matchingStrategy(MatchingStrategy.FREQUENCY)
				.rankingScoreThreshold(0.2)
				.filterArray(new String[][]{new String[]{"delFlag = 0", "enabled = 0"}})
				.q("笑对")
				.build();
		
		Searchable searchable = index.search(searchRequest);
		ArrayList<HashMap<String, Object>> searchableHits = searchable.getHits();
		List<ArchivedFile> copyToList = BeanUtil.copyToList(searchableHits, ArchivedFile.class);

4、设置index的区域

官方说这样会对中文更好一点,虽然不设置他也会自己检测 但是难免跑偏
在这里插入图片描述
PUT修改 GET查看
url: http://host:7700/indexes/{index}/settings/localized-attributes
body

[
  {
    "locales": [
      "cmn"
    ],
    "attributePatterns": [
      "*"
    ]
  }
]

http://www.niftyadmin.cn/n/5671706.html

相关文章

2024人工智能结课作业-DFS/BFS/Astar解决数码问题

1 深度优先遍历搜索(DFS) 1.1算法介绍 深度优先搜索算法&#xff08;Depth-First-Search&#xff0c;DFS&#xff09;是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所在边都己被探寻过&#xff0c;搜索将回溯到发…

NLP 文本分类任务核心梳理

解决思路 分解为多个独立二分类任务将多标签分类转化为多分类问题更换 loss 直接由模型进行多标签分类 数据稀疏问题 标注更多数据&#xff0c;核心解决方案&#xff1a; 自己构造训练样本 数据增强&#xff0c;如使用 chatGPT 来构造数据更换模型 减少数据需求增加规则弥补…

安装 Anaconda

目录 1. [Anaconda 简介](#anaconda-简介) 2. [安装 Anaconda](#安装-anaconda) 3. [环境管理](#环境管理) 1. [创建环境](#创建环境) 2. [激活与退出环境](#激活与退出环境) 3. [列出所有环境](#列出所有环境) 4. [删除环境](#删除环境) 5. [环境打包与恢复](#环境打包…

Github 2024-09-23 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-09-23统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6C++项目3C项目3HTML项目2PowerShell项目1TypeScript项目1JavaScript项目1Blade项目1PHP项目1Bootstrap 5: Web上开发响应式、移动优…

队列+宽搜专题篇

目录 N叉树的层序遍历 二叉树的锯齿形层序遍历 二叉树最大宽度 在每个树行中找最大值 N叉树的层序遍历 题目 思路 使用队列层序遍历来解决这道题&#xff0c;首先判断根节点是否为空&#xff0c;为空则返回空的二维数组&#xff1b;否则&#xff0c;就进行层序遍历&#x…

JavaEE: 深入探索TCP网络编程的奇妙世界(五)

文章目录 TCP核心机制TCP核心机制六: 拥塞控制为什么要有拥塞控制?动态调整的拥塞控制拥塞控制中,窗口大小具体的变化过程 TCP核心机制七: 延时应答TCP核心机制八: 捎带应答 TCP核心机制 前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(四) 书接上文~ TCP核心机制六: 拥…

【在Linux世界中追寻伟大的One Piece】验证TCP

目录 1 -> 验证TCP-windows作为client访问Linux 1.1 -> TCP client样例代码 1 -> 验证TCP-windows作为client访问Linux 1.1 -> TCP client样例代码 #include <winsock2.h> #include <iostream> #include <string>#pragma warning(disable : …

java日志框架之Log4j

文章目录 一、Log4j简介二、Log4j组件介绍1、Loggers (日志记录器)2、Appenders&#xff08;输出控制器&#xff09;3、Layout&#xff08;日志格式化器&#xff09; 三、Log4j快速入门四、Log4j自定义配置文件输出日志1、输出到控制台2、输出到文件3、输出到数据库 五、Log4j自…