Don, in order to use such query you have to keep mandatory and courseName relation in your index. In Compass you could use dynamic metadata ( http://www.compass-project.org/docs/2.2.0/reference/html/core-osem.html#core-osem-dynamic). This way you can add additional fileds into your document. You can create an artificial field which is combination of mandatory and courseName. But may be re-thinking your object model would be better in this case.
Lukas http://blog.lukas-vlcek.com/ On Thu, Jul 30, 2009 at 9:42 PM, Steven A Rowe <sar...@syr.edu> wrote: > Hi Donal, > > I looked at the XML index dump you provided, and I can see that there is > only one document in the index. This document matches your query. I've > pasted it below, without the "$/*"-named fields I'm assuming Compass adds to > manage Lucene document -> Grails object mapping, and with just the "name" > attribute on the field elements: > > <doc id='1'> > <field name='courseName'> > <val>cooking</val> > <val>art</val> > </field> > <field name='mandatory'> > <val>N</val> > <val>Y</val> > </field> > <field name='name'> > <val>Bob</val> > </field> > </doc> > > Compass's Lucene document to Grails object mapping is your problem here. > > In Lucene-land, the query (+courseName:cooking +mandatory:Y) matches the > above document, because the document contains those values in those fields. > > So with that query, based on the Lucene document structure, you seem to be > asking the question: "Which student attends a cooking course and also > attends a mandatory course?". Bob is a match. > > Steve > > > -----Original Message----- > > From: Donal Murtagh [mailto:domur...@yahoo.co.uk] > > Sent: Thursday, July 30, 2009 3:10 PM > > To: java-user@lucene.apache.org > > Subject: Re: Querying across object relationships > > > > Basically the classes I'm indexing have the following relationships: > > > > Student 1------* Attendance 1------* Course > > > > The > > only root class is Student, i.e. only instances of this class can be > > returned from a search. I have a Student object graph that could be > > represented in JSON as follows: > > > > { > > name: Bob, > > attendances: [ > > {mandatory: N, course: {name: cooking}}, > > {mandatory: Y, course: {name: art}}] > > } > > > > When I search for an instance of Student using the query: > > > > "+courseName:cooking +mandatory:Y" > > > > Bob > > is returned because, because he attends a course named "cooking" and he > > attends a mandatory course (named "art).. But what I really want to > > search for is students that attend a mandatory cooking course. It > > doesn't appear to be possible to do this based on the responses > > provided here: > > http://stackoverflow.com/questions/1202422/lucene-query- > > syntax/1203186#1203186 > > > > I > > opened the Student index in Luke, exported it to XML and have appended > > the results here: > > http://pastebin.com/m6e5bbcf3 > > > > I don't really know how to interpret this > > myself, but thanks in advance for any further help you can provide. > > > > - Don > > > > > > > > >