-
Notifications
You must be signed in to change notification settings - Fork 873
/
index.go
79 lines (63 loc) · 1.8 KB
/
index.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package types
type DocumentIndex struct {
// 文本的DocId
DocId uint64
// 文本的关键词长
TokenLength float32
// 加入的索引键
Keywords []KeywordIndex
}
// 反向索引项,这实际上标注了一个(搜索键,文档)对。
type KeywordIndex struct {
// 搜索键的UTF-8文本
Text string
// 搜索键词频
Frequency float32
// 搜索键在文档中的起始字节位置,按照升序排列
Starts []int
}
// 索引器返回结果
type IndexedDocument struct {
DocId uint64
// BM25,仅当索引类型为FrequenciesIndex或者LocationsIndex时返回有效值
BM25 float32
// 关键词在文档中的紧邻距离,紧邻距离的含义见computeTokenProximity的注释。
// 仅当索引类型为LocationsIndex时返回有效值。
TokenProximity int32
// 紧邻距离计算得到的关键词位置,和Lookup函数输入tokens的长度一样且一一对应。
// 仅当索引类型为LocationsIndex时返回有效值。
TokenSnippetLocations []int
// 关键词在文本中的具体位置。
// 仅当索引类型为LocationsIndex时返回有效值。
TokenLocations [][]int
}
// 方便批量加入文档索引
type DocumentsIndex []*DocumentIndex
func (docs DocumentsIndex) Len() int {
return len(docs)
}
func (docs DocumentsIndex) Swap(i, j int) {
docs[i], docs[j] = docs[j], docs[i]
}
func (docs DocumentsIndex) Less(i, j int) bool {
return docs[i].DocId < docs[j].DocId
}
// 释放资源
func (docs DocumentsIndex) Close() {
for _, doc := range docs {
if doc != nil {
doc.Keywords = nil
}
}
}
// 方便批量删除文档索引
type DocumentsId []uint64
func (docs DocumentsId) Len() int {
return len(docs)
}
func (docs DocumentsId) Swap(i, j int) {
docs[i], docs[j] = docs[j], docs[i]
}
func (docs DocumentsId) Less(i, j int) bool {
return docs[i] < docs[j]
}