Here's a way to do it using the XML query parser in contrib....
1) Create this query.xsl file (note use of cached double negative filter)

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:template match="/Document">
<FilteredQuery>
   <Query>
       <UserQuery><xsl:value-of select="query"/></UserQuery>
   </Query>
   <Filter>
       <CachedFilter>
           <BooleanFilter>
               <Clause occurs="mustNot">
<RangeFilter fieldName="surname" lowerTerm="a" upperTerm="z"/>
               </Clause>
               <Clause occurs="mustNot">
<RangeFilter fieldName="forename" lowerTerm="a" upperTerm="z"/>
               </Clause>
           </BooleanFilter>
       </CachedFilter>
   </Filter>
</FilteredQuery>
</xsl:template>
</xsl:stylesheet>
2) Query as follows:
       //Setup test data
Analyzer analyzer=new WhitespaceAnalyzer(); RAMDirectory rd=new RAMDirectory();
       IndexWriter w=new IndexWriter(rd,new WhitespaceAnalyzer(),true);
       Document d=new Document();
d.add(new Field("contents","foo 1- must not match",Field.Store.YES,Field.Index.TOKENIZED)); d.add(new Field("surname","smith",Field.Store.YES,Field.Index.TOKENIZED));
       w.addDocument(d);
d=new Document(); d.add(new Field("contents","foo 2- must not match",Field.Store.YES,Field.Index.TOKENIZED)); d.add(new Field("forename","fred",Field.Store.YES,Field.Index.TOKENIZED));
       w.addDocument(d);
d=new Document(); d.add(new Field("contents","foo 3- must not match",Field.Store.YES,Field.Index.TOKENIZED)); d.add(new Field("forename","fred",Field.Store.YES,Field.Index.TOKENIZED)); d.add(new Field("surname","smith",Field.Store.YES,Field.Index.TOKENIZED));
       w.addDocument(d);
d=new Document(); d.add(new Field("contents","foo 4- must match",Field.Store.YES,Field.Index.TOKENIZED));
       w.addDocument(d);
       w.close();
IndexSearcher searcher=new IndexSearcher(rd); //one-off setup - store these
       QueryTemplateManager qtm=new QueryTemplateManager(
               TestXml.class.getResourceAsStream("query.xsl"));
       CorePlusExtensionsParser cp = new CorePlusExtensionsParser(analyzer,
               new QueryParser("contents",analyzer));
//get the user form input
       String queryString="foo";
       Properties userInput=new Properties();
       userInput.setProperty("query",queryString);

// Transform the user input into a Lucene XML query, then pass to parser Query q=cp.getQuery(qtm.getQueryAsDOM(userInput).getDocumentElement()); Hits h = searcher.search(q);
       for (int i = 0; i < h.length(); i++)
       {
           d=h.doc(i);
           System.out.println(d.get("contents"));
       }

Cheers
Mark




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

Reply via email to