No it's only a single segment. But two calls. One doing a getHitsCount first and
the other doing the actual search. I'll paste both methods below if someone's
interested.
Will dig into lucene's sources and compare 2.4 search behaviour for my case with
2.9 tomorrow. It was about time to get more into lucene-core sources anyhow. :)
See you tomorrow guys and thanks a lot again! It's a pleasure.
public int getHitsCount(String query, Filter filter) throws
LuceneServiceException {
log.debug("getHitsCount('{}, {}')", query, filter);
if (StringUtils.isBlank(query)) {
log.warn("getHitsCount: empty lucene query");
return 0;
}
long startTimeMillis = System.currentTimeMillis();
int count = 0;
if (indexSearcher == null) {
return 0;
}
BooleanQuery.setMaxClauseCount(MAXCLAUSECOUNT);
Query q = null;
try {
q = createQuery(query);
TopScoreDocCollector tsdc =
TopScoreDocCollector.create(1, true);
indexSearcher.search(q, filter, tsdc);
count = tsdc.getTotalHits();
log.info("getHitsCount: count = {}",count);
} catch (ParseException ex) {
throw new LuceneServiceException("invalid lucene
query:" + query, ex);
} catch (IOException e) {
throw new LuceneServiceException(" indexSearcher could
be corrupted", e);
} finally {
long durationMillis = System.currentTimeMillis() -
startTimeMillis;
if (durationMillis > slowQueryLimit) {
log.warn("getHitsCount: Slow query: {} ms,
query={}", durationMillis, query);
}
log.debug("getHitsCount: query took {} ms",
durationMillis);
}
return count;
}
public List<Document> search(String query, Filter filter, Sort sort,
int from,
int size) throws LuceneServiceException {
log.debug("{} search('{}', {}, {}, {}, {})", new Object[] {
indexAlias, query,
filter, sort, from, size });
long startTimeMillis = System.currentTimeMillis();
List<Document> docs = new ArrayList<Document>();
if (indexSearcher == null) {
return docs;
}
Query q = null;
try {
if (query == null) {
log.warn("search: lucene query is null...");
return docs;
}
q = createQuery(query);
BooleanQuery.setMaxClauseCount(MAXCLAUSECOUNT);
if (size < 0 || size > maxNumHits) {
// set hard limit for numHits
size = maxNumHits;
if (log.isDebugEnabled())
log.debug("search: Size set to
hardlimit: {} for query: {} with filter:
{}", new Object[] { size, query, filter });
}
TopFieldCollector collector =
TopFieldCollector.create(sort, size + from,
true, false, false, true);
indexSearcher.search(q, filter, collector);
if(size > collector.getTotalHits())
size = collector.getTotalHits();
if (size > 100000)
log.info("search: size: {} bigger than 100.000
for query: {} with filter:
{}", new Object[] { size, query, filter });
TopDocs td = collector.topDocs(from, size);
ScoreDoc[] scoreDocs = td.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
docs.add(indexSearcher.doc(scoreDoc.doc));
}
} catch (ParseException e) {
log.warn("search: ParseException: {}", e.getMessage());
if (log.isDebugEnabled())
log.warn("search: ParseException: ", e);
return Collections.emptyList();
} catch (IOException e) {
log.warn("search: IOException: ", e);
return Collections.emptyList();
} finally {
long durationMillis = System.currentTimeMillis() -
startTimeMillis;
if (durationMillis > slowQueryLimit) {
log.warn("search: Slow query: {} ms, query={},
indexUsed={}",
new Object[] { durationMillis,
query,
indexSearcher.getIndexReader().directory() });
}
log.debug("search: query took {} ms", durationMillis);
}
return docs;
}
Uwe Schindler wrote:
>>> http://ankeschwarzer.de/tmp/lucene_29_newapi_mmap_singlereq.png
>>>
>>> Have to verify that the last one is not by accident more than one
>> request.
>>> Will
>>> do the run again and then post the required info.
>> The last figure shows, that IndexSearcher.searchWithFilter was called
>> twice
>> in contrast to the first figure, where IndexSearcher.search was called
>> only
>> once.
>
> I forgot, searchWithFilter it is called per segment in 2.9. If it was only
> one search, you must have two segments and therefore no optimized index for
> this to be correct?
>
> Uwe
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
--
Thomas Becker
Senior JEE Developer
net mobile AG
Zollhof 17
40221 Düsseldorf
GERMANY
Phone: +49 211 97020-195
Fax: +49 211 97020-949
Mobile: +49 173 5146567 (private)
E-Mail: mailto:[email protected]
Internet: http://www.net-m.de
Registergericht: Amtsgericht Düsseldorf, HRB 48022
Vorstand: Theodor Niehues (Vorsitzender), Frank Hartmann,
Kai Markus Kulas, Dieter Plassmann
Vorsitzender des
Aufsichtsrates: Dr. Michael Briem
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]