// 将文档加入索引 // // 输入参数: // docId 标识文档编号,必须唯一 // data 见DocumentIndexData注释 // // 注意: // 1. 这个函数是线程安全的,请尽可能并发调用以提高索引速度 // 2. 这个函数调用是非同步的,也就是说在函数返回时有可能文档还没有加入索引中,因此 // 如果立刻调用Search可能无法查询到这个文档。强制刷新索引请调用FlushIndex函数。 func (engine *Engine) IndexDocument(docId uint64, data DocumentIndexData) { engine.internalIndexDocument(docId, data) if engine.initOptions.UsePersistentStorage { hash := utils.Murmur3([]byte(fmt.Sprint("%d", docId))) % uint32(engine.searchpipline.GetStorageShards()) engine.persistentStorageIndexDocumentChannels[hash] <- persistentStorageIndexDocumentRequest{docId: docId, data: data} } }
func (engine *Engine) internalIndexDocument(docId uint64, data DocumentIndexData) { if !engine.initialized { log.Fatal("必须先初始化引擎") } atomic.AddUint64(&engine.numIndexingRequests, 1) hash := utils.Murmur3([]byte(fmt.Sprint("%d%s", docId, data.Content))) engine.segmenterChannel <- segmenterRequest{ docId: docId, hash: hash, data: data} }
// 将文档从索引中删除 // // 输入参数: // docId 标识文档编号,必须唯一 // // 注意:这个函数仅从排序器中删除文档的自定义评分字段,索引器不会发生变化。所以 // 你的自定义评分字段必须能够区别评分字段为nil的情况,并将其从排序结果中删除。 func (engine *Engine) RemoveDocument(docId uint64) { if !engine.initialized { log.Fatal("必须先初始化引擎") } for shard := 0; shard < engine.initOptions.NumShards; shard++ { engine.rankerRemoveScoringFieldsChannels[shard] <- rankerRemoveScoringFieldsRequest{docId: docId} } if engine.initOptions.UsePersistentStorage { // 从数据库中删除 hash := utils.Murmur3([]byte(fmt.Sprint("%d", docId))) % uint32(engine.searchpipline.GetStorageShards()) go engine.persistentStorageRemoveDocumentWorker(docId, hash) } }