最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang使用redis實現(xiàn)全文搜索功能詳解

 更新時間:2025年02月21日 10:09:38   作者:千年死緩  
這篇文章主要為大家詳細介紹了golang如何使用redis實現(xiàn)全文搜索功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

簡介

使用redis實現(xiàn)全部文章精確到段落的搜索

實現(xiàn)思路

文章分段,使用一張表單獨記錄下段落信息

段落分詞,把段落劃分成詞

分詞后使用有序集合記錄到redis中,每個詞語后記錄含有該分詞的段落ID集

使用一個哈希鍵記錄下每個段落的分詞,用于分詞信息的刪除

查詢時先分詞,再根據(jù)分的詞把分詞查到的對應(yīng)的段落

返回結(jié)果

具體實現(xiàn)

文章分段

文章段落表結(jié)構(gòu)

type TextModel struct {
    gorm.Model
    ArticleID uint   `json:"articleID"`
    Head      string `json:"head"`
    Body      string `json:"body"`
}

分段函數(shù)

//這里因為我的項目里出現(xiàn)了循環(huán)導包,所以沒有使用gorm的映射表進行處理
type TextModel struct {
    ArticleID uint   `json:"article_id"`
    Head      string `json:"head"`
    Body      string `json:"body"`
}

func MdContentTransformation(id uint, title string, content string) (list []TextModel) {
	lines := strings.Split(content, "\n")
	var headList []string
	var bodyList []string
	var body string
	headList = append(headList, title)
	var flag bool
	for _, line := range lines {
		if strings.HasPrefix(line, "```") {
			flag = !flag
		}
		if !flag && strings.HasPrefix(line, "#") {
			// 標題行
			headList = append(headList, getHead(line))
			if strings.TrimSpace(body) != "" {
				bodyList = append(bodyList, getBody(body))
			}
			body = ""
			continue
		}
		body += line
	}
	if body != "" {
		bodyList = append(bodyList, getBody(body))
	}
	if len(headList) > len(bodyList) {
		bodyList = append(bodyList, "")
	}

	if len(headList) != len(bodyList) {
		log.Errorf("headList與bodyList 不一致 \n headList:%q  %d\\\n bodyList: %q  %d\n", headList, len(headList), bodyList, len(bodyList))
		return
	}
    for i := 0; i < len(headList); i++ {
            list = append(list, TextModel{
            ArticleID: id,
            Head:      headList[i],
            Body:      bodyList[i],
        })
    }
    return
}

func getHead(head string) string {
    s := strings.TrimSpace(strings.Join(strings.Split(head, " ")[1:], " "))
    return s
}

func getBody(body string) string {
    body = strings.TrimSpace(body)
    return body
}

段落分詞

使用第三方庫進行分詞

https://github.com/go-ego/gse

第三方庫下載

go get -u github.com/go-ego/gse

庫初始化

func InitGse() {
    newGse, _ := gse.New()
    global_gse.Gse = newGse
}

分詞函數(shù)

func textParticiple(textList ...string) (words []string) {
    for _, text := range textList {
        word := global_gse.Gse.CutSearch(text, true)
        words = append(words, word...)
    }
    return
}

把分過的詞保存到到redis中

使用redis集合每個詞對應(yīng)的段落ID

func SetTextSearchIndex(textID uint, words []string) {
    for _, word := range words {
        if word == "" {
            continue
        }
        global.Redis.SAdd(fmt.Sprintf("text_%s", word), textID)
    }
}

使用哈希鍵記錄每個文章對應(yīng)的段落和詞語信息,用于信息刪除

func SetTextSearchWords(articleID uint, textID uint, words []string) {
    _words, _ := json.Marshal(words)
    global.Redis.HSet(fmt.Sprintf("text_search_words_%d", articleID), strconv.Itoa(int(textID)), _words)
}

查詢操作

通過將文本分詞過后的查詢詞語獲取一個段落集合

func GetTextSearchIndex(text string) []string {
    //分詞
    words := global_gse.Gse.CutSearch(text, true)
    var _words []string
    for _, word := range words {
        _words = append(_words, fmt.Sprintf("text_%s", word))
    }
    vals, _ := global.Redis.SUnion(_words...).Result()
    return vals
}

根據(jù)查到id列表查詢數(shù)據(jù)庫

idList := redis_article.GetTextSearchIndex(cr.Key)
query := global.DB.Where("id in ?", idList)

后續(xù)處理,使搜索的文字有高亮提示

可以將搜索的文字套在特定的標簽中然后再返回信息

以上就是golang使用redis實現(xiàn)全文搜索功能詳解的詳細內(nèi)容,更多關(guān)于go redis全文搜索的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言的type?func()用法詳解

    Go語言的type?func()用法詳解

    在Go語言中,函數(shù)的基本組成為:關(guān)鍵字func、函數(shù)名、參數(shù)列表、返回值、函數(shù)體和返回語句,這篇文章主要介紹了Go語言的type?func()用法,需要的朋友可以參考下
    2022-03-03
  • Golang特殊init函數(shù)的實現(xiàn)實例

    Golang特殊init函數(shù)的實現(xiàn)實例

    本文介紹了Go語言中特殊函數(shù)init()的作用,如變量初始化、包初始化順序以及與main函數(shù)的關(guān)系,具有一定的參考價值,感興趣的可以了解一下
    2025-11-11
  • Go基礎(chǔ)教程系列之Go接口使用詳解

    Go基礎(chǔ)教程系列之Go接口使用詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之Go接口使用詳解,需要的朋友可以參考下
    2022-04-04
  • Go map底層實現(xiàn)與擴容規(guī)則和特性分類詳細講解

    Go map底層實現(xiàn)與擴容規(guī)則和特性分類詳細講解

    這篇文章主要介紹了Go map底層實現(xiàn)與擴容規(guī)則和特性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-03-03
  • Go語言利用正則表達式處理多行文本

    Go語言利用正則表達式處理多行文本

    在?Go?語言中處理多行文本的正則表達式時,換行符常常會導致意外的匹配結(jié)果,本文為大家整理了一些解決方法,有需要的小伙伴可以參考一下
    2024-11-11
  • 深入解析如何基于go-retry構(gòu)建靈活安全和高效的重試邏輯

    深入解析如何基于go-retry構(gòu)建靈活安全和高效的重試邏輯

    本文將深入解析 sethvargo/go-retry 這個輕量且強大的 Go 重試庫,帶大家從原理到實踐,構(gòu)建靈活、安全、高效的重試邏輯,感興趣的小伙伴可以了解下
    2025-11-11
  • go并發(fā)數(shù)據(jù)一致性事務(wù)的保障面試應(yīng)答

    go并發(fā)數(shù)據(jù)一致性事務(wù)的保障面試應(yīng)答

    這篇文章主要為大家介紹了go并發(fā)數(shù)據(jù)一致性事務(wù)的保障面試應(yīng)答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go多文件調(diào)用與main函數(shù)踩坑及解決

    Go多文件調(diào)用與main函數(shù)踩坑及解決

    本文介紹了在學習Go語言時常見的幾個錯誤及其解決方法,包括多文件、main函數(shù)、包作用域以及gorun的使用方式,通過詳細的分析和示例,幫助讀者更好地理解和解決這些問題
    2026-02-02
  • 簡單聊聊Go語言的注釋

    簡單聊聊Go語言的注釋

    這篇文章主要介紹了簡單聊聊Go語言的注釋的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • 基于Go語言開發(fā)一個JSON格式校驗工具

    基于Go語言開發(fā)一個JSON格式校驗工具

    在日常開發(fā)中,經(jīng)常會遇到需要校驗 JSON 格式是否正確的場景,如果 JSON 格式不正確,系統(tǒng)往往會報錯甚至崩潰,因此開發(fā)一個 命令行 JSON 格式校驗工具 非常實用,所以本文給大家介紹了如何基于Go語言開發(fā)一個JSON格式校驗工具,需要的朋友可以參考下
    2025-09-09

最新評論

彭水| 兴文县| 桃江县| 遂溪县| 怀仁县| 河源市| 稷山县| 涞水县| 新昌县| 浙江省| 古田县| 定安县| 金昌市| 财经| 巍山| 白朗县| 旬邑县| 洛隆县| 德阳市| 塔河县| 靖州| 渑池县| 蒲城县| 诸城市| 嘉峪关市| 三原县| 茶陵县| 庄河市| 蒙自县| 霍山县| 应用必备| 昭平县| 离岛区| 北辰区| 当阳市| 青川县| 浪卡子县| 乳源| 西青区| 和林格尔县| 吉安市|