func (c *Consistent) hashKey(key string) uint32 { if len(key) < 64 { var scratch [64]byte copy(scratch[:], key) return murmur.Murmur3(scratch[:len(key)]) } return murmur.Murmur3([]byte(key)) }
// 将文档从索引中删除 // // 输入参数: // docId 标识文档编号,必须唯一,docId == 0 表示非法文档(用于强制刷新索引),[1, +oo) 表示合法文档 // forceUpdate 是否强制刷新 cache,如果设为 true,则尽快删除索引,否则等待 cache 满之后一次全量删除 // // 注意: // 1. 这个函数是线程安全的,请尽可能并发调用以提高索引速度 // 2. 这个函数调用是非同步的,也就是说在函数返回时有可能文档还没有加入索引中,因此 // 如果立刻调用Search可能无法查询到这个文档。强制刷新索引请调用FlushIndex函数。 func (engine *Engine) RemoveDocument(docId uint64, forceUpdate bool) { if !engine.initialized { log.Fatal("必须先初始化引擎") } if docId != 0 { atomic.AddUint64(&engine.numRemovingRequests, 1) } if forceUpdate { atomic.AddUint64(&engine.numForceUpdatingRequests, 1) } for shard := 0; shard < engine.initOptions.NumShards; shard++ { engine.indexerRemoveDocChannels[shard] <- indexerRemoveDocRequest{docId: docId, forceUpdate: forceUpdate} if docId == 0 { continue } engine.rankerRemoveDocChannels[shard] <- rankerRemoveDocRequest{docId: docId} } if engine.initOptions.UsePersistentStorage && docId != 0 { // 从数据库中删除 hash := murmur.Murmur3([]byte(fmt.Sprint("%d", docId))) % uint32(engine.initOptions.PersistentStorageShards) go engine.persistentStorageRemoveDocumentWorker(docId, hash) } }
// 将文档加入索引 // // 输入参数: // docId 标识文档编号,必须唯一 // data 见DocumentIndexData注释 // // 注意: // 1. 这个函数是线程安全的,请尽可能并发调用以提高索引速度 // 2. 这个函数调用是非同步的,也就是说在函数返回时有可能文档还没有加入索引中,因此 // 如果立刻调用Search可能无法查询到这个文档。强制刷新索引请调用FlushIndex函数。 func (engine *Engine) IndexDocument(docId uint64, data types.DocumentIndexData) { engine.internalIndexDocument(docId, data) hash := murmur.Murmur3([]byte(fmt.Sprint("%d", docId))) % uint32(engine.initOptions.PersistentStorageShards) if engine.initOptions.UsePersistentStorage { engine.persistentStorageIndexDocumentChannels[hash] <- persistentStorageIndexDocumentRequest{docId: docId, data: data} } }
func (engine *Engine) internalIndexDocument(docId uint64, data types.DocumentIndexData) { if !engine.initialized { log.Fatal("必须先初始化引擎") } atomic.AddUint64(&engine.numIndexingRequests, 1) hash := murmur.Murmur3([]byte(fmt.Sprint("%d%s", docId, data.Content))) engine.segmenterChannel <- segmenterRequest{ docId: docId, hash: hash, data: data} }
// 将文档从索引中删除 // // 输入参数: // docId 标识文档编号,必须唯一 // // 注意:这个函数仅从排序器中删除文档,索引器不会发生变化。 func (engine *Engine) RemoveDocument(docId uint64) { if !engine.initialized { log.Fatal("必须先初始化引擎") } for shard := 0; shard < engine.initOptions.NumShards; shard++ { engine.rankerRemoveDocChannels[shard] <- rankerRemoveDocRequest{docId: docId} } if engine.initOptions.UsePersistentStorage { // 从数据库中删除 hash := murmur.Murmur3([]byte(fmt.Sprint("%d", docId))) % uint32(engine.initOptions.PersistentStorageShards) go engine.persistentStorageRemoveDocumentWorker(docId, hash) } }