lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Adrien Grand <jpou...@gmail.com>
Subject Re: Scorer.iterator() - how to implement correctly
Date Mon, 04 Dec 2017 10:17:30 GMT
It is correct... but ConstantScoreQuery is the way to go with your
use-case. It should not return scores of 0 unless you are misusing the API
in some way. Please share the code that you use in order to build your
query.

Le lun. 4 déc. 2017 à 11:10, Vadim Gindin <vgindin@detectum.com> a écrit :

> Adrien.
>
> I've found some working solution. Here is how it calculates iterator:
>
> this.iterator = context.reader().postings(query.getTerm(),
> PostingsEnum.ALL);
> if (this.iterator == null) this.iterator = DocIdSetIterator.empty();
>
>
> Is that implementation correct?
>
> On Sun, Dec 3, 2017 at 4:43 PM, Vadim Gindin <vgindin@detectum.com> wrote:
>
> > Hi Adrien.
> >
> > ConstantScoreQuery - I'd tried that earlier. There is the problem. It
> > returns score = 0.0 for my configuration with Boolean.. I've debugged and
> > found, that it happens because of the following:
> >
> > @Override
> > public Weight createWeight(IndexSearcher searcher, boolean needsScores,
> float boost) throws IOException {
> >   final Weight innerWeight = searcher.createWeight(query, false, 1f);
> >   if (needsScores) {
> >     return new ConstantScoreWeight(this, boost) {
> >
> >
> > As you can see innerWeight is created with needsScores=false  and further
> > innerWeight.scorerSuplier will return null. That will lead to 0.0 final
> > score.
> >
> > Moreover I'm trying to start my current logic from simple step. That's
> why
> > I wanted to implement something simple and decide to write it from
> scratch.
> >
> > Ok, as you say - iterator is the reason of returning all documents. *So
> > how to properly implement scorer.iterator()?*
> >
> > Many thanks for your help!
> > Regards
> > Vadim Gindin
> >
> > On Fri, Dec 1, 2017 at 1:11 PM, Adrien Grand <jpountz@gmail.com> wrote:
> >
> >> There are many implementations because each query typically needs a
> custom
> >> DocIdSetIterator implementation. It looks like your use-case doesn't
> need
> >> a
> >> custom query though, you could use a TermQuery wrapped in a
> constant-score
> >> query (see my reply to the other question you asked).
> >>
> >> Le ven. 1 déc. 2017 à 08:24, Vadim Gindin <vgindin@detectum.com> a
> écrit
> >> :
> >>
> >> > Hi
> >> >
> >> > I'm implementing the custom QUERY with appropriate custom WEIGHT and
> >> > SCORER.
> >> >
> >> > I'm trying to implement Scorer.iterator() method. It should return an
> >> > iterator of documents that matches the query. Right? There are a lot
> of
> >> > descendant classes of the DocIdSetIterato.
> >> >
> >> > 1. How to choose correct one?
> >> > 2. How to correctly implement Scorer.iterator() method?
> >> >
> >> > I've tried DocIdSetIterator.all(context.reader().maxDoc());
> >> >
> >> > But as I can see it returns all documents.
> >> >
> >> > My task looks simple. I need to return a constant score depending on
> the
> >> > matched fields. I.e. field "model" score - 3f, field "vendor" - score
> -
> >> 5f.
> >> >
> >> > I'm creating a subquery for each field and specify score for it using
> >> > custom QUERY that is almost the same as TermQuery except Weight.Scorer
> >> >
> >> > Any help is appreciated.
> >> >
> >> > Regards,
> >> > Vadim Gindin
> >> >
> >>
> >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message