SimSearch:一个轻量级的springboot项目索引构建工具,实现快速模糊搜索

这篇具有很好参考价值的文章主要介绍了SimSearch:一个轻量级的springboot项目索引构建工具,实现快速模糊搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

大部分项目都会涉及模糊搜索功能,而实现模糊搜索一般分为两个派系:

  • like简约派系
  • 搜索引擎派系

对于较为大型的项目来说,使用Solr、ES或者Milvus之类的引擎是比较流行的选择了(效果只能说优秀),而对于中小型项目,如果考虑这些较为重型的引擎,就意味着开发成本和运维成本

而一个简单的项目,特别是很多后台管理系统,模糊搜索仅仅是一个附带的功能(并非核心功能),所以我并不花太多时间去集成一个重量级的搜索引擎,此时为了方便就会选择like系列(偷懒的时候就这么干)

但是like也存在一些问题:

  • 数据量较大时,性能会急剧下降
  • 搜索词必须完整存在数据库中,只能进行左右模糊匹配
  • 如果使用左右两边模糊就会导致索引失效

终究是为一时的懒惰付出了代价…

但是…终究是想抽个空喝一口茶,顺便摸个鱼,如此我只能祭出SimSearch:一个轻量级的springboot项目索引构建工具,实现快速模糊搜索,相比于搜索引擎派系,这是一种轻量级的实现方式


索引测试

使用100万行中文 进行模糊搜索测试

i7 16g

存储模式(saver) 平均耗时 最大耗时 最小耗时
nio-fs(nio文件模式) 45.93ms 144.5ms 15.04ms
base-fs(常规文件系统) 25.93ms 97.32ms 12.24ms
memory-fs(nmap文件模式) 23.75ms 114.12ms 8.4ms
memory(内存模式) 11.56ms 42.35ms 7.04ms

使用1000万行类似的中文创建索引后进行模糊搜索测试

存储模式(saver) 平均耗时 最大耗时 最小耗时
nio-fs(nio文件模式) 55.33ms 151.5ms 20.65ms
base-fs(常规文件系统) 63.02ms 102.73ms 15.34ms
memory-fs(nmap文件模式) 51.44ms 180.38ms 7.15ms
memory(内存模式) 12.98ms 50.26ms 8.04ms

相对于文件系统,内存性能最好的无疑的,前提是内存有余,或者数据量不是很过分

测试的文本相对来说较短,如果是长文本,理论上上来说性能会下降一些

另外,以上结果仅仅作为一个参考


使用教程

可以有两种使用模式:注解和工具类,最完整的使用教程可以看源码的demo项目

先来说说注解使用,在原有的实体类和业务代码上标几个注解即可

1. 引入依赖

 <dependency>
    <groupId>cn.langpy</groupId>
    <artifactId>simsearch</artifactId>
    <version>2.0.0</version>
  </dependency>

使用了@Aspect注解,未引入的自行引入,如aspectj或者spring-boot-starter-aop

2. 配置信息

在application.properties中配置

#索引存储器 默认为内存 [memory,memory-fs,base-fs,nio-fs]
#内存富裕的情况下使用memory,如果是百万以上数据量选用fs系列
sim-search.saver=memory
#索引位置,saver!=memory时需配置
sim-search.dir=/data/indexlocation
#创建索引的核心线程数量,根据cpu自行决定,可不填,默认为5
sim-search.thread-core-size=5
#创建索引的最大线程数量,根据cpu自行决定,可不填,默认为200
sim-search.thread-max-size=10
#创建索引的线程队列容量,自行决定,可不填,默认为200000
sim-search.thread-queue-size=200000
#重启时是否要对之前的索引进行删除,默认为false
sim-search.index.init=true
#最大返回的搜索结果数量
sim-search.result.size=50

3. 在需要创建索引的实体上标注需要创建索引的字段

import cn.langpy.simsearch.annotation.IndexColumn;
import cn.langpy.simsearch.annotation.IndexId;

public class Student {
    /*索引唯一id 必须*/
    @IndexId 
    private String id;
    /*需要创建索引的字段:用来模糊搜索*/
    @IndexColumn
    private String studentName;
    @IndexColumn
    private String schoolName;
    private String age;
}

4. 在需要创建索引的方法上加上创建索引的注解

import cn.langpy.simsearch.annotation.CreateIndex;
import cn.langpy.simsearch.annotation.DeleteIndex;
import cn.langpy.simsearch.annotation.SearchIndex;

@Service
public class StudentServiceImpl implements StudentService {
    /*加上@CreateIndex后 异步创建索引,不影响正常业务的保存逻辑 indexParam:需要创建索引的参数*/
    /*该注解包含了更新操作 有则更新 无则创建*/
    @CreateIndex(indexParam = "student")
   public  boolean insert(Student student){
     /*业务逻辑*/
   }
}

5. 在需要删除索引的方法上加上删除索引的注解

@Service
public class StudentServiceImpl implements StudentService {
  /*加上@DeleteIndex后 异步删除索引,不影响正常业务的删除逻辑 indexParam:需要删除索引的参数*/
   @DeleteIndex(indexParam = "student")
   public  boolean delete(Student student){
     /*业务逻辑*/
   }
}

6. 搜索的时候自定义一个空的方法,加上注解即可

@Service
public class StudentServiceImpl implements StudentService {
   /*根据studentName属性搜索Student 搜索的属性要和实体的属性保持一致  */
   @SearchIndex(by = "studentName")
   public  List<Student> search(Student student){
    /*方法内部什么都不需要写*/
     return null;
   }

   /*根据schoolName属性搜索Student */
   @SearchIndex(by = "schoolName")
   public  List<Student> search(Student Student){
    /*方法内部什么都不需要写*/
    /*如果再索引中未查到对应信息,可通过该方法设置默认查询,比如往数据库进行like模糊匹配*/
     return searchWithLikeByName(schoolName);
   }
}

注意:搜索结果仅仅是搜索出加上@IndexId和@IndexColumn的字段,具体内容自行往业务数据库查询


使工具类使用

public class IndexManager{
    /*创建索引*/
    public static void createIndex(IndexContent indexContent);
    /*删除索引*/
    public static void deleteIndex(String idName, String idValue,Class entityClass);
    /*搜索 详见源码的demo项目*/
    public static <T> List<T> searchIndexIds(String name, String value,Class<?> entityClass);
    /*搜索 详见源码的demo项目*/
    public static <T> List<T> searchIndexObjects(String name, String value,Class entityClass);
    public static void deleteAll();
    /*为对象创建索引*/
    public static void createIndex(Object entity);
    public static void createIndexs(List<Object> entities);
}

源码

有用的话可以Star支持一下,让作者增强信心,好好维护和升级

Gitee

很简单的demo项目文章来源地址https://www.toymoban.com/news/detail-430645.html

到了这里,关于SimSearch:一个轻量级的springboot项目索引构建工具,实现快速模糊搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot整合MeiliSearch轻量级搜索引擎

    一、Meilisearch与Easy Search点击进入官网了解,本文主要从小微型公司业务出发,选择meilisearch来作为项目的全文搜索引擎,还可以当成来mongodb来使用。 二、starter封装 1、项目结构展示 2、引入依赖包(我是有包统一管理的fastjson用的1.2.83,gson用的2.8.6) 3、yml参数读取代码参考

    2024年02月08日
    浏览(54)
  • Springboot集成轻量级内存数据库H2

    最近做一个小项目,需要存储的数据不多,用mysql太重了,用其他的Redis之类的也不太方便,然后就想到了H2,他就是一个jar包,可以和项目一起打包发布,非常适合数据量不多的微小系统,下面大概介绍下H2的基本知识和Springboot的集成 H2是一个用Java开发的嵌入式数据库,它本

    2024年02月07日
    浏览(49)
  • 【KRouter】一个简单且轻量级的Kotlin Routing框架

    KRouter(Kotlin-Router)是一个简单而轻量级的Kotlin路由框架。 具体来说,KRouter是一个通过URI来发现接口实现类的框架。它的使用方式如下: 之所以这样做,是因为在使用Voyager一段时间后,我发现模块之间的通信不够灵活,需要一些配置,而且使用DeepLink有点奇怪,所以我更喜

    2024年02月09日
    浏览(106)
  • golang一个轻量级基于内存的kv存储或缓存

    golang一个轻量级基于内存的kv存储或缓存 go-cache是一个轻量级的基于内存的key:value 储存组件,类似于memcached,适用于在单机上运行的应用程序。 它的主要优点是,本质上是一个具有过期时间的线程安全map[string]interface{}。interface的结构决定了它不需要序列化。基于内存的特性

    2024年02月02日
    浏览(73)
  • OpenHarmony实战开发-如何实现一个轻量级输入法应用。

    ​ 本示例使用inputMethodEngine实现一个轻量级输入法应用kikaInput,支持在运行OpenHarmony OS的智能终端上。 使用说明 1.使用hdc shell aa start ability -a InputMethod -b cn.openharmony.inputmethodchoosedialog命令拉起切换输入法弹窗,点击kikainput切换输入法到当前应用。 2.点击应用中的编辑框,拉起

    2024年04月24日
    浏览(60)
  • 教你使用PHP实现一个轻量级HTML模板引擎

    🏆作者简介,黑夜开发者,全栈领域新星创作者✌,2023年6月csdn上海赛道top4。多年电商行业从业经验,对系统架构,数据分析处理等大规模应用场景有丰富经验。 🏆本文已收录于PHP专栏:PHP进阶实战教程。 🏆另有专栏PHP入门基础教程,希望各位大佬多多支持❤️。 在 W

    2024年02月15日
    浏览(51)
  • LLM-Client一个轻量级的LLM集成工具

    大型语言模型(llm)已经彻底改变了我们与文本交互的方式,OpenAI、Google、AI21、HuggingfaceHub、Anthropic和众多开源模型提供了不同的功能和优势。但是每个模型都有其独特的体系结构、api和兼容性需求,集成这些模型是一项耗时且具有挑战性的任务。 所以这时候LangChain就解决了这

    2024年02月11日
    浏览(204)
  • 用go设计开发一个自己的轻量级登录库/框架吧

    几乎每个项目都会有登录,退出等用户功能,而登录又不单仅仅是登录,我们要考虑很多东西。 token该怎么生成?生成什么样的? 是在Cookie存token还是请求头存token?读取的时候怎么读取? 允许同一个账号被多次登录吗?多次登录他们的token是一样的?还是不一样的? 登录也

    2024年02月03日
    浏览(59)
  • 一个现代化轻量级的跨平台Redis桌面客户端

    大家好,我是 Java陈序员 。 Redis 作为一款高性能的非关系型数据库,可是深受开发者的喜爱,无论是什么开发,都能看到 Redis 的身影。 今天,给大家介绍一款跨平台的 Redis 客户端连接工具,功能强大,界面美观! 关注微信公众号:【Java陈序员】,获取开源项目分享、AI副

    2024年04月08日
    浏览(93)
  • 一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库

    今天给大家分享一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库:LiteDB。本篇文章主要是介绍LiteDB和在.NET中如何使用。 LiteDB 是一个小巧、快速和轻量级的 .NET NoSQL 嵌入式数据库。 无服务器的 NoSQL 文档存储 简单的 API,类似于 MongoDB 100% 的 C# 代码支持 .NET 4.5 / NETStandard 1.

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包