-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathindex.go
74 lines (63 loc) · 1.53 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
package stalefish
import "sort"
// 転置インデックス
// TokenIDー>ポスティングリストのマップ
type InvertedIndex map[TokenID]PostingList
func NewInvertedIndex(m map[TokenID]PostingList) InvertedIndex {
return InvertedIndex(m)
}
func (ii InvertedIndex) TokenIDs() []TokenID {
ids := []TokenID{}
for i := range ii {
ids = append(ids, i)
}
sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] })
return ids
}
// ポスティングリスト
type PostingList struct {
Postings *Postings // トークンごとのポスティングリスト
}
func NewPostingList(pl *Postings) PostingList {
return PostingList{
Postings: pl,
}
}
func (p PostingList) Size() int {
size := 0
pp := p.Postings
for pp != nil {
pp = pp.Next
size++
}
return size
}
func (p PostingList) AppearanceCountInDocument(docID DocumentID) int {
count := 0
pp := p.Postings
for pp != nil {
if pp.DocumentID == docID {
count = len(pp.Positions)
break
}
pp = pp.Next
}
return count
}
// ポスティング(ドキュメントID等を含むリンクリスト)
type Postings struct {
DocumentID DocumentID // ドキュメントのID
Positions []uint64 // ドキュメント中での位置情報
Next *Postings // 次のポスティングへのポインタ
}
func NewPostings(documentID DocumentID, positions []uint64, next *Postings) *Postings {
return &Postings{
DocumentID: documentID,
Positions: positions,
Next: next,
}
}
func (p *Postings) PushBack(e *Postings) {
e.Next = p.Next
p.Next = e
}