lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Uwe Schindler" <...@thetaphi.de>
Subject RE: Uable to extends TopTermsRewrite in Lucene 4.1
Date Tue, 26 Feb 2013 17:13:05 GMT
Hi,

You cannot override rewrite() because you could easily break the logic behind TopTermsRewrite.
If you want another behavior, subclass another base class and wrap the TopTermsRewrite instead
of subclassing it (the generics also enforce that the rewrite needs to rewrite() to a class
that’s specified in the generics parameter).

addClause() is not final, its abstract. There is one "final" helper method used by the rewrite
itself, but the methods you need to override are abstract.

Also your generics seem to be wrong, leading to the above question...

Uwe

-----
Uwe Schindler
H.-H.-Meier-Allee 63, D-28213 Bremen
http://www.thetaphi.de
eMail: uwe@thetaphi.de


> -----Original Message-----
> From: Paul Taylor [mailto:paul_t100@fastmail.fm]
> Sent: Tuesday, February 26, 2013 5:34 PM
> To: java-user@lucene.apache.org
> Subject: Uable to extends TopTermsRewrite in Lucene 4.1
> 
> In Lucene 3.6 I had code that replicated a Dismax Query, and the search used
> fuzzy queries in some cases to match values. But I was finding the score
> attributed to matches on fuzzy searches was completely different to the
> score attributed to matches on exact searches so the total score returned
> was not good. I improved this by extends TopTermsRewrite so that if the
> query is a prefix query we boost it as if was exact match, I dont fully
> understand this but it improved things somewhat, but in Lucene 4.1 the
> rewrite() and addClause() methods are final
> 
> So how can I implement this in Lucene 4.1, do I even need to - is there a
> more intuitive way to improve the scoring.
> 
> This is what I currently have that wont compile because of the final methods
> 
>      //TODO FIXME WAS Overriding methods that are now final
>      public static class MultiTermUseIdfOfSearchTerm<Q extends
> DisjunctionMaxQuery> extends TopTermsRewrite<Query> {
> 
>      //public static final class MultiTermUseIdfOfSearchTerm extends
> TopTermsRewrite<BooleanQuery> {
>          private final TFIDFSimilarity similarity;
> 
>          public MultiTermUseIdfOfSearchTerm(int size) {
>              super(size);
>              this.similarity = new DefaultSimilarity();
> 
>          }
> 
>          @Override
>          protected int getMaxSize() {
>              return BooleanQuery.getMaxClauseCount();
>          }
> 
>          @Override
>          protected DisjunctionMaxQuery getTopLevelQuery() {
>              return new DisjunctionMaxQuery(0.1f);
>          }
> 
>          @Override
>          protected void addClause(Query topLevel, Term term, float boost) {
>              final Query tq = new ConstantScoreQuery(new TermQuery(term));
>              tq.setBoost(boost);
>              ((DisjunctionMaxQuery)topLevel).add(tq);
>          }
> 
>          protected float getQueryBoost(final IndexReader reader, final
> MultiTermQuery query)
>                  throws IOException {
>              float idf = 1f;
>              float df;
>              if (query instanceof PrefixQuery)
>              {
>                  PrefixQuery fq = (PrefixQuery) query;
>                  df = reader.docFreq(fq.getPrefix());
>                  if(df>=1)
>                  {
>                      //Same as idf value for search term, 0.5 acts as length norm
>                      idf = (float)Math.pow(similarity.idf((int) df,
> reader.numDocs()),2) * 0.5f;
>                  }
>              }
>              return idf;
>          }
> 
>          @Override
>          public Query rewrite(final IndexReader reader, final MultiTermQuery
> query) throws IOException {
>              DisjunctionMaxQuery  bq =
> (DisjunctionMaxQuery)super.rewrite(reader, query);
> 
>              float idfBoost = getQueryBoost(reader, query);
>              Iterator<Query> iterator = bq.iterator();
>              while(iterator.hasNext())
>              {
>                  Query next = iterator.next();
>                  next.setBoost(next.getBoost() * idfBoost);
>              }
>              return bq;
>          }
> 
>      }
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> For additional commands, e-mail: java-user-help@lucene.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org


Mime
View raw message