国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SimSearch:一個(gè)輕量級(jí)的springboot項(xiàng)目索引構(gòu)建工具,實(shí)現(xiàn)快速模糊搜索

這篇具有很好參考價(jià)值的文章主要介紹了SimSearch:一個(gè)輕量級(jí)的springboot項(xiàng)目索引構(gòu)建工具,實(shí)現(xiàn)快速模糊搜索。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

簡(jiǎn)介

大部分項(xiàng)目都會(huì)涉及模糊搜索功能,而實(shí)現(xiàn)模糊搜索一般分為兩個(gè)派系:

  • like簡(jiǎn)約派系
  • 搜索引擎派系

對(duì)于較為大型的項(xiàng)目來(lái)說(shuō),使用Solr、ES或者M(jìn)ilvus之類的引擎是比較流行的選擇了(效果只能說(shuō)優(yōu)秀),而對(duì)于中小型項(xiàng)目,如果考慮這些較為重型的引擎,就意味著開(kāi)發(fā)成本和運(yùn)維成本

而一個(gè)簡(jiǎn)單的項(xiàng)目,特別是很多后臺(tái)管理系統(tǒng),模糊搜索僅僅是一個(gè)附帶的功能(并非核心功能),所以我并不花太多時(shí)間去集成一個(gè)重量級(jí)的搜索引擎,此時(shí)為了方便就會(huì)選擇like系列(偷懶的時(shí)候就這么干)

但是like也存在一些問(wèn)題:

  • 數(shù)據(jù)量較大時(shí),性能會(huì)急劇下降
  • 搜索詞必須完整存在數(shù)據(jù)庫(kù)中,只能進(jìn)行左右模糊匹配
  • 如果使用左右兩邊模糊就會(huì)導(dǎo)致索引失效

終究是為一時(shí)的懶惰付出了代價(jià)…

但是…終究是想抽個(gè)空喝一口茶,順便摸個(gè)魚(yú),如此我只能祭出SimSearch:一個(gè)輕量級(jí)的springboot項(xiàng)目索引構(gòu)建工具,實(shí)現(xiàn)快速模糊搜索,相比于搜索引擎派系,這是一種輕量級(jí)的實(shí)現(xiàn)方式


索引測(cè)試

使用100萬(wàn)行中文 進(jìn)行模糊搜索測(cè)試

i7 16g

存儲(chǔ)模式(saver) 平均耗時(shí) 最大耗時(shí) 最小耗時(shí)
nio-fs(nio文件模式) 45.93ms 144.5ms 15.04ms
base-fs(常規(guī)文件系統(tǒng)) 25.93ms 97.32ms 12.24ms
memory-fs(nmap文件模式) 23.75ms 114.12ms 8.4ms
memory(內(nèi)存模式) 11.56ms 42.35ms 7.04ms

使用1000萬(wàn)行類似的中文創(chuàng)建索引后進(jìn)行模糊搜索測(cè)試

存儲(chǔ)模式(saver) 平均耗時(shí) 最大耗時(shí) 最小耗時(shí)
nio-fs(nio文件模式) 55.33ms 151.5ms 20.65ms
base-fs(常規(guī)文件系統(tǒng)) 63.02ms 102.73ms 15.34ms
memory-fs(nmap文件模式) 51.44ms 180.38ms 7.15ms
memory(內(nèi)存模式) 12.98ms 50.26ms 8.04ms

相對(duì)于文件系統(tǒng),內(nèi)存性能最好的無(wú)疑的,前提是內(nèi)存有余,或者數(shù)據(jù)量不是很過(guò)分

測(cè)試的文本相對(duì)來(lái)說(shuō)較短,如果是長(zhǎng)文本,理論上上來(lái)說(shuō)性能會(huì)下降一些

另外,以上結(jié)果僅僅作為一個(gè)參考


使用教程

可以有兩種使用模式:注解和工具類,最完整的使用教程可以看源碼的demo項(xiàng)目

先來(lái)說(shuō)說(shuō)注解使用,在原有的實(shí)體類和業(yè)務(wù)代碼上標(biāo)幾個(gè)注解即可

1. 引入依賴

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

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

2. 配置信息

在application.properties中配置

#索引存儲(chǔ)器 默認(rèn)為內(nèi)存 [memory,memory-fs,base-fs,nio-fs]
#內(nèi)存富裕的情況下使用memory,如果是百萬(wàn)以上數(shù)據(jù)量選用fs系列
sim-search.saver=memory
#索引位置,saver!=memory時(shí)需配置
sim-search.dir=/data/indexlocation
#創(chuàng)建索引的核心線程數(shù)量,根據(jù)cpu自行決定,可不填,默認(rèn)為5
sim-search.thread-core-size=5
#創(chuàng)建索引的最大線程數(shù)量,根據(jù)cpu自行決定,可不填,默認(rèn)為200
sim-search.thread-max-size=10
#創(chuàng)建索引的線程隊(duì)列容量,自行決定,可不填,默認(rèn)為200000
sim-search.thread-queue-size=200000
#重啟時(shí)是否要對(duì)之前的索引進(jìn)行刪除,默認(rèn)為false
sim-search.index.init=true
#最大返回的搜索結(jié)果數(shù)量
sim-search.result.size=50

3. 在需要?jiǎng)?chuàng)建索引的實(shí)體上標(biāo)注需要?jiǎng)?chuàng)建索引的字段

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

public class Student {
    /*索引唯一id 必須*/
    @IndexId 
    private String id;
    /*需要?jiǎng)?chuàng)建索引的字段:用來(lái)模糊搜索*/
    @IndexColumn
    private String studentName;
    @IndexColumn
    private String schoolName;
    private String age;
}

4. 在需要?jiǎng)?chuàng)建索引的方法上加上創(chuàng)建索引的注解

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后 異步創(chuàng)建索引,不影響正常業(yè)務(wù)的保存邏輯 indexParam:需要?jiǎng)?chuàng)建索引的參數(shù)*/
    /*該注解包含了更新操作 有則更新 無(wú)則創(chuàng)建*/
    @CreateIndex(indexParam = "student")
   public  boolean insert(Student student){
     /*業(yè)務(wù)邏輯*/
   }
}

5. 在需要?jiǎng)h除索引的方法上加上刪除索引的注解

@Service
public class StudentServiceImpl implements StudentService {
  /*加上@DeleteIndex后 異步刪除索引,不影響正常業(yè)務(wù)的刪除邏輯 indexParam:需要?jiǎng)h除索引的參數(shù)*/
   @DeleteIndex(indexParam = "student")
   public  boolean delete(Student student){
     /*業(yè)務(wù)邏輯*/
   }
}

6. 搜索的時(shí)候自定義一個(gè)空的方法,加上注解即可

@Service
public class StudentServiceImpl implements StudentService {
   /*根據(jù)studentName屬性搜索Student 搜索的屬性要和實(shí)體的屬性保持一致  */
   @SearchIndex(by = "studentName")
   public  List<Student> search(Student student){
    /*方法內(nèi)部什么都不需要寫(xiě)*/
     return null;
   }

   /*根據(jù)schoolName屬性搜索Student */
   @SearchIndex(by = "schoolName")
   public  List<Student> search(Student Student){
    /*方法內(nèi)部什么都不需要寫(xiě)*/
    /*如果再索引中未查到對(duì)應(yīng)信息,可通過(guò)該方法設(shè)置默認(rèn)查詢,比如往數(shù)據(jù)庫(kù)進(jìn)行l(wèi)ike模糊匹配*/
     return searchWithLikeByName(schoolName);
   }
}

注意:搜索結(jié)果僅僅是搜索出加上@IndexId和@IndexColumn的字段,具體內(nèi)容自行往業(yè)務(wù)數(shù)據(jù)庫(kù)查詢


使工具類使用

public class IndexManager{
    /*創(chuàng)建索引*/
    public static void createIndex(IndexContent indexContent);
    /*刪除索引*/
    public static void deleteIndex(String idName, String idValue,Class entityClass);
    /*搜索 詳見(jiàn)源碼的demo項(xiàng)目*/
    public static <T> List<T> searchIndexIds(String name, String value,Class<?> entityClass);
    /*搜索 詳見(jiàn)源碼的demo項(xiàng)目*/
    public static <T> List<T> searchIndexObjects(String name, String value,Class entityClass);
    public static void deleteAll();
    /*為對(duì)象創(chuàng)建索引*/
    public static void createIndex(Object entity);
    public static void createIndexs(List<Object> entities);
}

源碼

有用的話可以Star支持一下,讓作者增強(qiáng)信心,好好維護(hù)和升級(jí)

Gitee

很簡(jiǎn)單的demo項(xiàng)目文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-430645.html

到了這里,關(guān)于SimSearch:一個(gè)輕量級(jí)的springboot項(xiàng)目索引構(gòu)建工具,實(shí)現(xiàn)快速模糊搜索的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • springboot整合MeiliSearch輕量級(jí)搜索引擎

    springboot整合MeiliSearch輕量級(jí)搜索引擎

    一、Meilisearch與Easy Search點(diǎn)擊進(jìn)入官網(wǎng)了解,本文主要從小微型公司業(yè)務(wù)出發(fā),選擇meilisearch來(lái)作為項(xiàng)目的全文搜索引擎,還可以當(dāng)成來(lái)mongodb來(lái)使用。 二、starter封裝 1、項(xiàng)目結(jié)構(gòu)展示 2、引入依賴包(我是有包統(tǒng)一管理的fastjson用的1.2.83,gson用的2.8.6) 3、yml參數(shù)讀取代碼參考

    2024年02月08日
    瀏覽(25)
  • Springboot集成輕量級(jí)內(nèi)存數(shù)據(jù)庫(kù)H2

    最近做一個(gè)小項(xiàng)目,需要存儲(chǔ)的數(shù)據(jù)不多,用mysql太重了,用其他的Redis之類的也不太方便,然后就想到了H2,他就是一個(gè)jar包,可以和項(xiàng)目一起打包發(fā)布,非常適合數(shù)據(jù)量不多的微小系統(tǒng),下面大概介紹下H2的基本知識(shí)和Springboot的集成 H2是一個(gè)用Java開(kāi)發(fā)的嵌入式數(shù)據(jù)庫(kù),它本

    2024年02月07日
    瀏覽(17)
  • 教你使用PHP實(shí)現(xiàn)一個(gè)輕量級(jí)HTML模板引擎

    教你使用PHP實(shí)現(xiàn)一個(gè)輕量級(jí)HTML模板引擎

    ??作者簡(jiǎn)介,黑夜開(kāi)發(fā)者,全棧領(lǐng)域新星創(chuàng)作者?,2023年6月csdn上海賽道top4。多年電商行業(yè)從業(yè)經(jīng)驗(yàn),對(duì)系統(tǒng)架構(gòu),數(shù)據(jù)分析處理等大規(guī)模應(yīng)用場(chǎng)景有豐富經(jīng)驗(yàn)。 ??本文已收錄于PHP專欄:PHP進(jìn)階實(shí)戰(zhàn)教程。 ??另有專欄PHP入門(mén)基礎(chǔ)教程,希望各位大佬多多支持??。 在 W

    2024年02月15日
    瀏覽(101)
  • OpenHarmony實(shí)戰(zhàn)開(kāi)發(fā)-如何實(shí)現(xiàn)一個(gè)輕量級(jí)輸入法應(yīng)用。

    OpenHarmony實(shí)戰(zhàn)開(kāi)發(fā)-如何實(shí)現(xiàn)一個(gè)輕量級(jí)輸入法應(yīng)用。

    ? 本示例使用inputMethodEngine實(shí)現(xiàn)一個(gè)輕量級(jí)輸入法應(yīng)用kikaInput,支持在運(yùn)行OpenHarmony OS的智能終端上。 使用說(shuō)明 1.使用hdc shell aa start ability -a InputMethod -b cn.openharmony.inputmethodchoosedialog命令拉起切換輸入法彈窗,點(diǎn)擊kikainput切換輸入法到當(dāng)前應(yīng)用。 2.點(diǎn)擊應(yīng)用中的編輯框,拉起

    2024年04月24日
    瀏覽(89)
  • golang一個(gè)輕量級(jí)基于內(nèi)存的kv存儲(chǔ)或緩存

    golang一個(gè)輕量級(jí)基于內(nèi)存的kv存儲(chǔ)或緩存 go-cache是一個(gè)輕量級(jí)的基于內(nèi)存的key:value 儲(chǔ)存組件,類似于memcached,適用于在單機(jī)上運(yùn)行的應(yīng)用程序。 它的主要優(yōu)點(diǎn)是,本質(zhì)上是一個(gè)具有過(guò)期時(shí)間的線程安全map[string]interface{}。interface的結(jié)構(gòu)決定了它不需要序列化?;趦?nèi)存的特性

    2024年02月02日
    瀏覽(99)
  • 【KRouter】一個(gè)簡(jiǎn)單且輕量級(jí)的Kotlin Routing框架

    【KRouter】一個(gè)簡(jiǎn)單且輕量級(jí)的Kotlin Routing框架

    KRouter(Kotlin-Router)是一個(gè)簡(jiǎn)單而輕量級(jí)的Kotlin路由框架。 具體來(lái)說(shuō),KRouter是一個(gè)通過(guò)URI來(lái)發(fā)現(xiàn)接口實(shí)現(xiàn)類的框架。它的使用方式如下: 之所以這樣做,是因?yàn)樵谑褂肰oyager一段時(shí)間后,我發(fā)現(xiàn)模塊之間的通信不夠靈活,需要一些配置,而且使用DeepLink有點(diǎn)奇怪,所以我更喜

    2024年02月09日
    瀏覽(570)
  • LLM-Client一個(gè)輕量級(jí)的LLM集成工具

    LLM-Client一個(gè)輕量級(jí)的LLM集成工具

    大型語(yǔ)言模型(llm)已經(jīng)徹底改變了我們與文本交互的方式,OpenAI、Google、AI21、HuggingfaceHub、Anthropic和眾多開(kāi)源模型提供了不同的功能和優(yōu)勢(shì)。但是每個(gè)模型都有其獨(dú)特的體系結(jié)構(gòu)、api和兼容性需求,集成這些模型是一項(xiàng)耗時(shí)且具有挑戰(zhàn)性的任務(wù)。 所以這時(shí)候LangChain就解決了這

    2024年02月11日
    瀏覽(98)
  • 用go設(shè)計(jì)開(kāi)發(fā)一個(gè)自己的輕量級(jí)登錄庫(kù)/框架吧

    幾乎每個(gè)項(xiàng)目都會(huì)有登錄,退出等用戶功能,而登錄又不單僅僅是登錄,我們要考慮很多東西。 token該怎么生成?生成什么樣的? 是在Cookie存token還是請(qǐng)求頭存token?讀取的時(shí)候怎么讀??? 允許同一個(gè)賬號(hào)被多次登錄嗎?多次登錄他們的token是一樣的?還是不一樣的? 登錄也

    2024年02月03日
    瀏覽(91)
  • 一個(gè)小巧、快速、輕量級(jí)的 .NET NoSQL 嵌入式數(shù)據(jù)庫(kù)

    一個(gè)小巧、快速、輕量級(jí)的 .NET NoSQL 嵌入式數(shù)據(jù)庫(kù)

    今天給大家分享一個(gè)小巧、快速、輕量級(jí)的 .NET NoSQL 嵌入式數(shù)據(jù)庫(kù):LiteDB。本篇文章主要是介紹LiteDB和在.NET中如何使用。 LiteDB 是一個(gè)小巧、快速和輕量級(jí)的 .NET NoSQL 嵌入式數(shù)據(jù)庫(kù)。 無(wú)服務(wù)器的 NoSQL 文檔存儲(chǔ) 簡(jiǎn)單的 API,類似于 MongoDB 100% 的 C# 代碼支持 .NET 4.5 / NETStandard 1.

    2024年02月02日
    瀏覽(21)
  • 一個(gè)現(xiàn)代化輕量級(jí)的跨平臺(tái)Redis桌面客戶端

    大家好,我是 Java陳序員 。 Redis 作為一款高性能的非關(guān)系型數(shù)據(jù)庫(kù),可是深受開(kāi)發(fā)者的喜愛(ài),無(wú)論是什么開(kāi)發(fā),都能看到 Redis 的身影。 今天,給大家介紹一款跨平臺(tái)的 Redis 客戶端連接工具,功能強(qiáng)大,界面美觀! 關(guān)注微信公眾號(hào):【Java陳序員】,獲取開(kāi)源項(xiàng)目分享、AI副

    2024年04月08日
    瀏覽(91)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包