137
137
////////////////////////////////////////////////////////////////
139
// Returns the lowest matching score before the results are
141
public void DoQuery (Query query,
143
ICollection search_subset_uris, // should be internal uris
144
QueryPartHook query_part_hook,
145
UriFilter uri_filter,
146
HitFilter hit_filter)
139
// Returns the lists of terms in the query
140
private ArrayList AssembleQuery (Query query,
141
QueryPartHook query_part_hook,
142
HitFilter hit_filter,
143
out ArrayList primary_required_part_queries,
144
out ArrayList secondary_required_part_queries,
145
out LNS.BooleanQuery primary_prohibited_part_query,
146
out LNS.BooleanQuery secondary_prohibited_part_query,
147
out AndHitFilter all_hit_filters)
149
Logger.Log.Debug ("###### {0}: Starting low-level queries", IndexName);
151
Stopwatch total, a, b, c, d, e, f;
153
total = new Stopwatch ();
154
a = new Stopwatch ();
155
b = new Stopwatch ();
156
c = new Stopwatch ();
157
d = new Stopwatch ();
158
e = new Stopwatch ();
159
f = new Stopwatch ();
164
// Assemble all of the parts into a bunch of Lucene queries
166
ArrayList primary_required_part_queries = null;
167
ArrayList secondary_required_part_queries = null;
169
LNS.BooleanQuery primary_prohibited_part_query = null;
170
LNS.BooleanQuery secondary_prohibited_part_query = null;
172
AndHitFilter all_hit_filters;
149
primary_required_part_queries = null;
150
secondary_required_part_queries = null;
151
primary_prohibited_part_query = null;
152
secondary_prohibited_part_query = null;
173
154
all_hit_filters = new AndHitFilter ();
174
155
if (hit_filter != null)
175
156
all_hit_filters.Add (hit_filter);
232
Log.Debug ("###### {0}: Building queries took {1}", IndexName, a);
234
// If we have no required parts, give up.
235
if (primary_required_part_queries == null)
241
// Now that we have all of these nice queries, let's execute them!
244
// Create the searchers that we will need.
246
IndexReader primary_reader;
247
LNS.IndexSearcher primary_searcher;
248
IndexReader secondary_reader = null;
249
LNS.IndexSearcher secondary_searcher = null;
214
private void BuildSearchers (out IndexReader primary_reader,
215
out LNS.IndexSearcher primary_searcher,
216
out IndexReader secondary_reader,
217
out LNS.IndexSearcher secondary_searcher)
219
secondary_reader = null;
220
secondary_searcher = null;
251
222
primary_reader = LuceneCommon.GetReader (PrimaryStore);
252
223
primary_searcher = new LNS.IndexSearcher (primary_reader);
262
233
if (secondary_reader != null)
263
234
secondary_searcher = new LNS.IndexSearcher (secondary_reader);
267
Log.Debug ("###### {0}: Readers/searchers built in {1}", IndexName, b);
269
// Build whitelists and blacklists for search subsets.
272
// Possibly create our whitelists from the search subset.
274
LuceneBitArray primary_whitelist = null;
275
LuceneBitArray secondary_whitelist = null;
237
private void CloseSearchers (IndexReader primary_reader,
238
LNS.IndexSearcher primary_searcher,
239
IndexReader secondary_reader,
240
LNS.IndexSearcher secondary_searcher)
242
primary_searcher.Close ();
243
if (secondary_searcher != null)
244
secondary_searcher.Close ();
245
ReleaseReader (primary_reader);
246
if (secondary_reader != null)
247
ReleaseReader (secondary_reader);
250
private void CreateQueryWhitelists (ICollection search_subset_uris,
251
LNS.IndexSearcher primary_searcher,
252
LNS.IndexSearcher secondary_searcher,
253
LNS.BooleanQuery primary_prohibited_part_query,
254
LNS.BooleanQuery secondary_prohibited_part_query,
255
out LuceneBitArray primary_whitelist,
256
out LuceneBitArray secondary_whitelist)
258
primary_whitelist = null;
259
secondary_whitelist = null;
277
261
if (search_subset_uris != null && search_subset_uris.Count > 0) {
278
262
primary_whitelist = new LuceneBitArray (primary_searcher);
327
311
secondary_whitelist.AndNot (secondary_blacklist);
316
////////////////////////////////////////////////////////////////
318
public int DoCountMatchQuery (Query query, QueryPartHook query_part_hook)
321
Logger.Log.Debug ("###### {0}: Starting low-level queries", IndexName);
324
total = new Stopwatch ();
327
ArrayList primary_required_part_queries;
328
ArrayList secondary_required_part_queries;
330
LNS.BooleanQuery primary_prohibited_part_query;
331
LNS.BooleanQuery secondary_prohibited_part_query;
333
AndHitFilter all_hit_filters;
336
term_list = AssembleQuery ( query,
339
out primary_required_part_queries,
340
out secondary_required_part_queries,
341
out primary_prohibited_part_query,
342
out secondary_prohibited_part_query,
343
out all_hit_filters);
345
// If we have no required parts, give up.
346
if (primary_required_part_queries == null)
349
IndexReader primary_reader;
350
LNS.IndexSearcher primary_searcher;
351
IndexReader secondary_reader;
352
LNS.IndexSearcher secondary_searcher;
354
BuildSearchers (out primary_reader, out primary_searcher, out secondary_reader, out secondary_searcher);
356
// Build whitelists and blacklists for search subsets.
357
LuceneBitArray primary_whitelist, secondary_whitelist;
358
CreateQueryWhitelists (null,
361
primary_prohibited_part_query,
362
secondary_prohibited_part_query,
363
out primary_whitelist,
364
out secondary_whitelist);
366
// Now run the low level queries against our indexes.
367
BetterBitArray primary_matches = null;
368
if (primary_required_part_queries != null) {
370
if (secondary_searcher != null)
371
primary_matches = DoRequiredQueries_TwoIndex (primary_searcher,
373
primary_required_part_queries,
374
secondary_required_part_queries,
376
secondary_whitelist);
378
primary_matches = DoRequiredQueries (primary_searcher,
379
primary_required_part_queries,
385
// FIXME: Pass the count through uri-filter and other validation checks
386
if (primary_matches != null)
387
result = primary_matches.TrueCount;
389
CloseSearchers (primary_reader, primary_searcher, secondary_reader, secondary_searcher);
393
Logger.Log.Debug ("###### {0}: Total query run in {1}", IndexName, total);
398
////////////////////////////////////////////////////////////////
400
public void DoQuery (Query query,
402
ICollection search_subset_uris, // should be internal uris
403
QueryPartHook query_part_hook,
404
UriFilter uri_filter,
405
HitFilter hit_filter)
408
Logger.Log.Debug ("###### {0}: Starting low-level queries", IndexName);
410
Stopwatch total, a, b, c, d, e, f;
412
total = new Stopwatch ();
413
a = new Stopwatch ();
414
b = new Stopwatch ();
415
c = new Stopwatch ();
416
d = new Stopwatch ();
417
e = new Stopwatch ();
418
f = new Stopwatch ();
423
ArrayList primary_required_part_queries;
424
ArrayList secondary_required_part_queries;
426
LNS.BooleanQuery primary_prohibited_part_query;
427
LNS.BooleanQuery secondary_prohibited_part_query;
429
AndHitFilter all_hit_filters;
433
// Assemble all of the parts into a bunch of Lucene queries
435
term_list = AssembleQuery (query,
438
out primary_required_part_queries,
439
out secondary_required_part_queries,
440
out primary_prohibited_part_query,
441
out secondary_prohibited_part_query,
442
out all_hit_filters);
446
Log.Debug ("###### {0}: Building queries took {1}", IndexName, a);
448
// If we have no required parts, give up.
449
if (primary_required_part_queries == null)
455
// Now that we have all of these nice queries, let's execute them!
458
IndexReader primary_reader;
459
LNS.IndexSearcher primary_searcher;
460
IndexReader secondary_reader;
461
LNS.IndexSearcher secondary_searcher;
463
// Create the searchers that we will need.
465
BuildSearchers (out primary_reader, out primary_searcher, out secondary_reader, out secondary_searcher);
469
Log.Debug ("###### {0}: Readers/searchers built in {1}", IndexName, b);
471
// Build whitelists and blacklists for search subsets.
474
// Possibly create our whitelists from the search subset.
475
LuceneBitArray primary_whitelist, secondary_whitelist;
476
CreateQueryWhitelists (search_subset_uris,
479
primary_prohibited_part_query,
480
secondary_prohibited_part_query,
481
out primary_whitelist,
482
out secondary_whitelist);