[ https://issues.apache.org/jira/browse/LUCENE-4574?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13503497#comment-13503497 ]
Yonik Seeley commented on LUCENE-4574: -------------------------------------- FunctionValues isn't the right place to solve this... that would cause caching/checking at every level of a function. If scorers are supposed to cache their scores, then the right place would be the scorer used for function queries and the function query comparator. If not, then the issue is more with the TopFieldCollector implementations. What was the actual value for "sort" that caused OneComparatorScoringMaxScoreCollector to be used? > FunctionQuery ValueSource value computed twice per document > ----------------------------------------------------------- > > Key: LUCENE-4574 > URL: https://issues.apache.org/jira/browse/LUCENE-4574 > Project: Lucene - Core > Issue Type: Bug > Components: core/search > Affects Versions: 4.0, 4.1 > Reporter: David Smiley > > I was working on a custom ValueSource and did some basic profiling and > debugging to see if it was being used optimally. To my surprise, the value > was being fetched twice per document in a row. This computation isn't > exactly cheap to calculate so this is a big problem. I was able to > work-around this problem trivially on my end by caching the last value with > corresponding docid in my FunctionValues implementation. > Here is an excerpt of the code path to the first execution: > {noformat} > at > org.apache.lucene.queries.function.docvalues.DoubleDocValues.floatVal(DoubleDocValues.java:48) > at > org.apache.lucene.queries.function.FunctionQuery$AllScorer.score(FunctionQuery.java:153) > at > org.apache.lucene.search.TopFieldCollector$OneComparatorScoringMaxScoreCollector.collect(TopFieldCollector.java:291) > at org.apache.lucene.search.Scorer.score(Scorer.java:62) > at > org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:588) > at > org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:280) > {noformat} > And here is the 2nd call: > {noformat} > at > org.apache.lucene.queries.function.docvalues.DoubleDocValues.floatVal(DoubleDocValues.java:48) > at > org.apache.lucene.queries.function.FunctionQuery$AllScorer.score(FunctionQuery.java:153) > at > org.apache.lucene.search.ScoreCachingWrappingScorer.score(ScoreCachingWrappingScorer.java:56) > at > org.apache.lucene.search.FieldComparator$RelevanceComparator.copy(FieldComparator.java:951) > at > org.apache.lucene.search.TopFieldCollector$OneComparatorScoringMaxScoreCollector.collect(TopFieldCollector.java:312) > at org.apache.lucene.search.Scorer.score(Scorer.java:62) > at > org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:588) > at > org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:280) > {noformat} > The 2nd call appears to use some score caching mechanism, which is all well > and good, but that same mechanism wasn't used in the first call so there's no > cached value to retrieve. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org For additional commands, e-mail: dev-h...@lucene.apache.org