Przeglądaj źródła

允许跳过ranker,不对搜索到的文档进行排序

geili 10 lat temu
rodzic
commit
c4188105f3
3 zmienionych plików z 25 dodań i 2 usunięć
  1. 5 2
      engine/engine.go
  2. 16 0
      engine/indexer_worker.go
  3. 4 0
      types/search_request.go

+ 5 - 2
engine/engine.go

@@ -313,6 +313,7 @@ func (engine *Engine) Search(request types.SearchRequest) (output types.SearchRe
 		docIds:              request.DocIds,
 		options:             rankOptions,
 		rankerReturnChannel: rankerReturnChannel,
+		orderless:           request.Orderless,
 	}
 
 	// 向索引器发送查找请求
@@ -356,7 +357,7 @@ func (engine *Engine) Search(request types.SearchRequest) (output types.SearchRe
 	}
 
 	// 再排序
-	if !request.CountDocsOnly {
+	if !request.CountDocsOnly && !request.Orderless {
 		if rankOptions.ReverseOrder {
 			sort.Sort(sort.Reverse(rankOutput))
 		} else {
@@ -366,7 +367,9 @@ func (engine *Engine) Search(request types.SearchRequest) (output types.SearchRe
 
 	// 准备输出
 	output.Tokens = tokens
-	if !request.CountDocsOnly {
+	if !request.Orderless {
+		output.Docs = rankOutput
+	} else if !request.CountDocsOnly {
 		var start, end int
 		if rankOptions.MaxOutputs == 0 {
 			start = utils.MinInt(rankOptions.OutputOffset, len(rankOutput))

+ 16 - 0
engine/indexer_worker.go

@@ -16,6 +16,7 @@ type indexerLookupRequest struct {
 	docIds              map[uint64]bool
 	options             types.RankOptions
 	rankerReturnChannel chan rankerReturnRequest
+	orderless           bool
 }
 
 func (engine *Engine) indexerAddDocumentWorker(shard int) {
@@ -44,6 +45,21 @@ func (engine *Engine) indexerLookupWorker(shard int) {
 			continue
 		}
 
+		if request.orderless {
+			var outputDocs []types.ScoredDocument
+			for _, d := range docs {
+				outputDocs = append(outputDocs, types.ScoredDocument{
+					DocId: d.DocId,
+					TokenSnippetLocations: d.TokenSnippetLocations,
+					TokenLocations:        d.TokenLocations})
+			}
+			request.rankerReturnChannel <- rankerReturnRequest{
+				docs:    outputDocs,
+				numDocs: len(outputDocs),
+			}
+			continue
+		}
+
 		rankerRequest := rankerRankRequest{
 			countDocsOnly:       request.countDocsOnly,
 			docs:                docs,

+ 4 - 0
types/search_request.go

@@ -24,6 +24,10 @@ type SearchRequest struct {
 
 	// 设为true时仅统计搜索到的文档个数,不返回具体的文档
 	CountDocsOnly bool
+
+	// 不排序,对于可在引擎外部(比如客户端)排序情况适用
+	// 对返回文档很多的情况打开此选项可以有效节省时间
+	Orderless bool
 }
 
 type RankOptions struct {