66using RsseEngine . Contracts ;
77using RsseEngine . Dto ;
88using RsseEngine . Indexes ;
9- using RsseEngine . Iterators ;
109using RsseEngine . Pools ;
1110using RsseEngine . Processor ;
1211
@@ -42,7 +41,7 @@ public void FindExtended(TokenVector searchVector, IMetricsCalculator metricsCal
4241 try
4342 {
4443 if ( ! RelevanceFilter . FindFilteredDocumentsExtendedMerge ( GinExtended , searchVector , idsFromGin ,
45- sortedIds , out var filteredTokensCount ) )
44+ sortedIds , out var filteredTokensCount , out var minRelevancyCount ) )
4645 {
4746 return ;
4847 }
@@ -59,7 +58,7 @@ public void FindExtended(TokenVector searchVector, IMetricsCalculator metricsCal
5958
6059 foreach ( var documentId in idFromGin )
6160 {
62- if ( GinExtended . TryGetExternalDocumentId ( documentId , out var externalDocumentId ) )
61+ if ( GinExtended . TryGetOffsetTokenVector ( documentId , out _ , out var externalDocumentId ) )
6362 {
6463 metricsCalculator . AppendExtended ( 1 , searchVector , externalDocumentId , GeneralDirectIndex ) ;
6564 }
@@ -72,7 +71,7 @@ public void FindExtended(TokenVector searchVector, IMetricsCalculator metricsCal
7271 if ( cancellationToken . IsCancellationRequested )
7372 throw new OperationCanceledException ( nameof ( ExtendedSearchGinMerge ) ) ;
7473
75- CreateExtendedSearchSpace ( searchVector , metricsCalculator , sortedIds , filteredTokensCount ) ;
74+ CreateExtendedSearchSpace ( searchVector , metricsCalculator , sortedIds , filteredTokensCount , minRelevancyCount ) ;
7675
7776 break ;
7877 }
@@ -92,9 +91,10 @@ public void FindExtended(TokenVector searchVector, IMetricsCalculator metricsCal
9291 /// <param name="metricsCalculator"></param>
9392 /// <param name="sortedIds"></param>
9493 /// <param name="filteredTokensCount"></param>
94+ /// <param name="minRelevancyCount">Количество векторов обеспечивающих релевантность.</param>
9595 /// <returns>Список векторов GIN.</returns>
9696 private void CreateExtendedSearchSpace ( TokenVector searchVector , IMetricsCalculator metricsCalculator ,
97- List < InternalDocumentIdList > sortedIds , int filteredTokensCount )
97+ List < InternalDocumentIdList > sortedIds , int filteredTokensCount , int minRelevancyCount )
9898 {
9999 var list = TempStoragePool . ListInternalEnumeratorListsStorage . Get ( ) ;
100100 var listExists = TempStoragePool . IntListsStorage . Get ( ) ;
@@ -117,20 +117,14 @@ private void CreateExtendedSearchSpace(TokenVector searchVector, IMetricsCalcula
117117 }
118118 }
119119
120- if ( listExists . Count == 1 )
121- {
122- AppendMetric2 ( list , listExists , metricsCalculator , searchVector ) ;
123- return ;
124- }
125-
126- do
120+ while ( listExists . Count > 1 )
127121 {
128122 MergeAlgorithm . FindMin ( list , listExists , out var minI0 , out var docId0 , out var docId1 ) ;
129123
130124 START :
131125 if ( docId0 . Value < docId1 . Value )
132126 {
133- AppendMetric1 ( searchVector , metricsCalculator , docId0 ) ;
127+ CalculateAndAppendMetric ( metricsCalculator , searchVector , docId0 , minRelevancyCount ) ;
134128
135129 ref var enumeratorI = ref CollectionsMarshal . AsSpan ( list ) [ minI0 ] ;
136130 if ( ! enumeratorI . MoveNext ( ) )
@@ -146,34 +140,34 @@ private void CreateExtendedSearchSpace(TokenVector searchVector, IMetricsCalcula
146140 }
147141 else if ( docId0 == docId1 )
148142 {
149- var sIndex = int . MaxValue ;
150-
151143 for ( var i = listExists . Count - 1 ; i >= 0 ; i -- )
152144 {
153145 var index = listExists [ i ] ;
154146
155147 ref var enumeratorI = ref CollectionsMarshal . AsSpan ( list ) [ index ] ;
156148 if ( docId0 == enumeratorI . Current )
157149 {
158- sIndex = Math . Min ( sIndex , index ) ;
159150 if ( ! enumeratorI . MoveNext ( ) )
160151 {
161152 SwapAndRemoveAt ( listExists , i ) ;
162153 }
163154 }
164155 }
165156
166- // поиск в векторе extended
167- if ( sIndex < int . MaxValue )
168- {
169- CalculateAndAppendMetric ( metricsCalculator , searchVector , docId0 ) ;
170- }
157+ CalculateAndAppendMetric ( metricsCalculator , searchVector , docId0 , minRelevancyCount ) ;
171158 }
172- } while ( listExists . Count > 1 ) ;
159+ }
173160
174161 if ( listExists . Count == 1 )
175162 {
176- AppendMetric2 ( list , listExists , metricsCalculator , searchVector ) ;
163+ var index = listExists [ 0 ] ;
164+ var enumerator = list [ index ] ;
165+
166+ do
167+ {
168+ var documentId = enumerator . Current ;
169+ CalculateAndAppendMetric ( metricsCalculator , searchVector , documentId , minRelevancyCount ) ;
170+ } while ( enumerator . MoveNext ( ) ) ;
177171 }
178172 }
179173 finally
@@ -184,53 +178,35 @@ private void CreateExtendedSearchSpace(TokenVector searchVector, IMetricsCalcula
184178 }
185179 }
186180
187- private void AppendMetric1 ( TokenVector searchVector , IMetricsCalculator metricsCalculator ,
188- InternalDocumentId documentId )
189- {
190- CalculateAndAppendMetric ( metricsCalculator , searchVector , documentId ) ;
191- }
192-
193- private void AppendMetric2 ( List < InternalDocumentListEnumerator > list , List < int > listExists ,
194- IMetricsCalculator metricsCalculator , TokenVector searchVector )
181+ private void CalculateAndAppendMetric ( IMetricsCalculator metricsCalculator , TokenVector searchVector ,
182+ InternalDocumentId documentId , int minRelevancyCount )
195183 {
196- var index = listExists [ 0 ] ;
197- var enumerator = list [ index ] ;
198-
199- do
184+ if ( ! GinExtended . TryGetOffsetTokenVector ( documentId , out var offsetTokenVector , out var externalDocumentId ) )
200185 {
201- var documentId = enumerator . Current ;
202- CalculateAndAppendMetric ( metricsCalculator , searchVector , documentId ) ;
203- } while ( enumerator . MoveNext ( ) ) ;
204- }
186+ return ;
187+ }
205188
206- private void CalculateAndAppendMetric ( IMetricsCalculator metricsCalculator , TokenVector searchVector ,
207- InternalDocumentId documentId )
208- {
209- const int sIndex = 0 ;
189+ var position = - 1 ;
190+ var empty = 0 ;
210191
211- if ( GinExtended . TryGetOffsetTokenVector ( documentId , out var offsetTokenVector ) )
192+ for ( var i = 0 ; i < searchVector . Count ; i ++ )
212193 {
213- var position = - 1 ;
214- var metric = 0 ;
194+ var token = searchVector . ElementAt ( i ) ;
215195
216- for ( var i = sIndex ; i < searchVector . Count ; i ++ )
196+ if ( ! offsetTokenVector . TryFindNextTokenPosition ( token , ref position ) )
217197 {
218- var token = searchVector . ElementAt ( i ) ;
198+ empty ++ ;
219199
220- if ( offsetTokenVector . TryFindNextTokenPosition ( token , ref position ) )
200+ if ( empty > searchVector . Count - minRelevancyCount )
221201 {
222- metric ++ ;
223- }
224- }
225-
226- if ( position >= 0 )
227- {
228- if ( GinExtended . TryGetExternalDocumentId ( documentId , out var externalDocumentId ) )
229- {
230- metricsCalculator . AppendExtended ( metric , searchVector , externalDocumentId , GeneralDirectIndex ) ;
202+ return ;
231203 }
232204 }
233205 }
206+
207+ var metric = searchVector . Count - empty ;
208+
209+ metricsCalculator . AppendExtended ( metric , searchVector , externalDocumentId , GeneralDirectIndex ) ;
234210 }
235211
236212 private static void SwapAndRemoveAt ( List < int > listExists , int i )
0 commit comments