Hi Cedric,

Thanks for the detailed response. My suggestion would be to write up a set of patches that demonstrate what you want for the SpanQuery stuff, and the BooleanQuery stuff, preferably as separate patches. The SpanQuery stuff makes the most sense to me and since I am slowly, but surely, working on it, I could try to incorporate it.

As for the HitCollector, I am not exactly sure what you are trying to get at there. What Object is going to be passed in? Is it the Match object? What would it mean for other implementations that aren't using a Match object? How would it be incorporated into Lucene for a general case? Again, a patch here may make it obvious.

-Grant

On Sep 22, 2007, at 5:45 AM, melix wrote:


Hi all,

Sorry for the late response, I've been quite busy (working on my Lucene tweak, and still not finished ;)). Basically, I need to be able to find out what matched on a document basis on a complex query. For example, in a OR clause, I need to know which of the sub(s) clause(s) have matched, and, going deeper in the query tree, for each subclause itself, find out what
matched. This is made to be able to score documents with semantics
reasoning.

As I want to limit breaking Lucene compatibility, I've decided to try, as most as possible, to subclass Lucene classes. This is where it starts to be difficult. So I've subclassed (most of) span queries classes so that the
getSpans() method returns my own span interface :

public interface IExtendedSpans extends Spans,IMatcher {
}

public interface IMatcher {
     Match match();
}

The reason why I have a separate IMatcher interface is that span queries are not the only queries which may "return" matches. We'll see this later. So I implemented my own SpanNearQuery, which inherits the Lucene SNQ, so that when a span is found, I can return the corresponding match. A match is a collection of submatches, and I've decided to subclass the Match class for each query type (this makes algorithms more readable, and easier to write).
For a span near query, the match() method will basically return a
SpanNearMatch, and so on.

Problem : the Lucene span queries members are private -not protected-, so subclasses cannot use them. For example, my subclass needs access to the clauses, and I have to use the getter while I could directly use the member (performance implication). Next, the spans subclasses are private static
classes, and I have to rewrite them to return *my* spans. So in this
particular point, this is really annoying because I have to copy the exact inner classes (if not anonymous...) just to add my match() method. This is annoying because by doing this, I'm potentially breaking compatibility with
future releases of Lucene.

The problem was even harder when I had to add the match() method to the BooleanQuery : this class is so complex, and uses so many protected or inner classes (for optimization purposes, I must understand) that I would have to
copy a lot of the original source code just to add my method. As
documentation on how it works is really hard to find, I decided it would be simpler if I wrote my own boolean queries (which is what I've done now). I
know it must be much less performant, but makes the tasks much easier.

By the way, it would really be glad if the you could extract an interface from the Query class. As all my queries implement an interface (to be sure that you don't mix queries which support the match feature with ones that
don't), it would avoid many casts (the other solution would be that I
extract the interface myself and make my IMatchAwareQuery interface have those methods, but I'm sure it would be cleaner if this was directly in
Lucene).

Last but not least, it would be glad if the HitCollector class had a
collect() method with an Object parameter : the scoring I'm using cannot just work on a collection of floats. It requires the matches, so I'm passing a DocMatchesHolder instance to my HitCollector so that it can work on it. This leads to the following (and not really clean) code recopied in my top
level Scorer implementations :

public void score(HitCollector aHitCollector) throws IOException {
                if (aHitCollector instanceof SearchingContext) {
                        SearchingContext ctx = (SearchingContext) aHitCollector;
                        while (next()) {
                                final DocMatchesHolder doc = docMatches();
                                final float score = score();
                                ctx.addHit(doc, score);
                                ctx.collect(doc(), score);
                        }
                } else super.score(aHitCollector);
        }

Thanks for reading ;)

Cedric
--
View this message in context: http://www.nabble.com/Span-queries%2C- API-and-difficulties-tf4500460.html#a12835063 Sent from the Lucene - Java Developer mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


------------------------------------------------------
Grant Ingersoll
http://www.grantingersoll.com/
http://lucene.grantingersoll.com
http://www.paperoftheweek.com/



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to