用go构建个简单的搜索(二)最简单的索引文件

753 阅读1分钟

本篇说下写的最简单的索引文件 O(∩_∩)O

数据怎么简单怎么来结果写的demo索引文件比原文件还大!!!

上图了:

image.png

上篇中遗留的问题

image.png

demo索引文件说明

image.png

  1. 直接保存的文本字符串,改了下后缀

  2. 一行一个词

  3. 例子:改变|1|3|122573 122579|8528 8534|8326 8332

  4. 说明: 词|文档ID|词频|位置开始和结束1|位置开始和结束2|位置开始和结束3

  5. 注意:开始结束位置是go字符串来的(别的语言来看可能不太习惯

构建索引时间花费情况

  • 索引落盘时间花费最多的是切词后单词的位置信息可能那里使用有问题吧 image.png

  • 根据索引文件加载到内存耗时情况

image.png

  • 通过对比后索引文件落盘加载效率是有很大提升的
  • 索引价加载代码部分
/**
 * 字典树
 * 文档信息
 * 索引文件数组(文件每行的字符串)
 */
func loadFileToTree(dict *dictTree, doc *docDes, str []string) bool {
	bT := time.Now()
	for _, line := range str {
		if "" == line {
			continue
		}
		//fmt.Printf("%s\n", line)
		pos := strings.Split(line, "|")
		var newDoc docDes
		doc.copy(&newDoc)
		newDoc.Term = pos[0]
		id, _ := strconv.ParseInt(pos[1], 10, 32)
		newDoc.Id = uint32(id)
		count, _ := strconv.ParseInt(pos[2], 10, 32)
		newDoc.Count = uint32(count)
		//fmt.Printf("%s,%d\n", pos[0], count)
		dict.insert(pos[0], &newDoc)
	}
	eT := time.Since(bT)
	fmt.Println("解析到内存耗时:", eT)
	return true
}

后续事情

  • 需要优化下索引文件的大小,可能会压缩文件或者改变下文件的存储格式