Here is my attempt at a KeywordAnalyzer - although is not working? Excuse the length of the message, but wanted to give actual code. package domain.lucenesearch; import java.io.*; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.CharTokenizer; import org.apache.lucene.analysis.TokenStream; public class KeywordAnalyzer extends Analyzer { public TokenStream tokenStream(String s, Reader reader) { return new KeywordTokenizer(reader); } private class KeywordTokenizer extends CharTokenizer { public KeywordTokenizer(Reader in) { super(in); } /** * Collects all characters. */ protected boolean isTokenChar(char c) { return true; } }
However, this test: fails public class KeywordAnalyzerTest extends TestCase { RAMDirectory directory; private IndexSearcher searcher; public void setUp() throws Exception { directory = new RAMDirectory(); IndexWriter writer = new IndexWriter(directory, new StandardAnalyzer(), true); Document doc = new Document(); doc.add(Field.Keyword("category", "HW-NCI_TOPICS")); doc.add(Field.Text("description", "Illidium Space Modulator")); writer.addDocument(doc); writer.close(); searcher = new IndexSearcher(directory); } public void testPerFieldAnalyzer() throws Exception { analyze("HW-NCI_TOPICS"); PerFieldAnalyzerWrapper analyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer()); analyzer.addAnalyzer("category", new KeywordAnalyzer()); //|#1 Query query = QueryParser.parse("category:HW-NCI_TOPICS AND SPACE", "description", analyzer); Hits hits = searcher.search(query); System.out.println("query.ToString = " + query.toString("description")); assertEquals("HW-NCI_TOPICS kept as-is", "category:HW-NCI_TOPICS +space", query.toString("description")); assertEquals("doc found!", 1, hits.length()); } private void analyze(String text) throws Exception { Analyzer[] analyzers = new Analyzer[]{ new WhitespaceAnalyzer(), new SimpleAnalyzer(), new StopAnalyzer(), new StandardAnalyzer(), new KeywordAnalyzer(), //new SnowballAnalyzer("English", StopAnalyzer.ENGLISH_STOP_WORDS) }; System.out.println("Analzying \"" + text + "\""); for (int i = 0; i < analyzers.length; i++) { Analyzer analyzer = analyzers[i]; System.out.println("\t" + analyzer.getClass().getName() + ":"); System.out.print("\t\t"); TokenStream stream = analyzer.tokenStream("category", new StringReader(text)); while (true) { Token token = stream.next(); if (token == null) break; System.out.print("[" + token.termText() + "] "); } System.out.println("\n"); } } } With this output: Analzying "HW-NCI_TOPICS" org.apache.lucene.analysis.WhitespaceAnalyzer: [HW-NCI_TOPICS] org.apache.lucene.analysis.SimpleAnalyzer: [hw] [nci] [topics] org.apache.lucene.analysis.StopAnalyzer: [hw] [nci] [topics] org.apache.lucene.analysis.standard.StandardAnalyzer: [hw] [nci] [topics] healthecare.domain.lucenesearch.KeywordAnalyzer: [HW-NCI_TOPICS] query.ToString = category:HW -"nci topics" +space junit.framework.ComparisonFailure: HW-NCI_TOPICS kept as-is Expected:+category:HW-NCI_TOPICS +space Actual :category:HW -"nci topics" +space See anything? thanks, chad. -----Original Message----- From: Chad Small Sent: Tue 3/23/2004 8:48 PM To: Lucene Users List Cc: Subject: RE: Query syntax on Keyword field question Thanks-you Erik and Incze. I now understand the issue and I'm trying to create a "KeywordAnalyzer" as suggested from you book excerpt, Erik: http://issues.apache.org/eyebrowse/[EMAIL PROTECTED]&msgNo=6727 However, not being all that familiar with the Analyzer framework, I'm not sure how to implement the "KeywordAnalyzer" even though it might be "trivial" :) Any hints, code, or messages to look at? <<from message link above>> Ok, here is the section from Lucene in Action. I'll leave the development of KeywordAnalyzer as an exercise for the reader (although its implementation is trivial, one of the simplest analyzers possible - only emit one token of the entire contents). I hope this helps. Erik >> thanks again, chad. -----Original Message----- From: Incze Lajos [mailto:[EMAIL PROTECTED] Sent: Tue 3/23/2004 8:08 PM To: Lucene Users List Cc: Subject: Re: Query syntax on Keyword field question On Tue, Mar 23, 2004 at 08:10:15PM -0500, Erik Hatcher wrote: > QueryParser and Field.Keyword fields are a strange mix. For some > background, check the archives as this has been covered pretty > extensively. > > A quick answer is yes you can use MFQP and QP with keyword fields, > however you need to be careful which analyzer you use. > PerFieldAnalyzerWrapper is a good solution - you'll just need to use an > analyzer for your keyword field which simply tokenizes the whole string > as one chunk. Perhaps such an analyzer should be made part of the > core? > > Erik I've implemented suche an analyzer but it's only partial solution if your keyword field contains spaces, as the QP would split the query, e.g.: NOTTOKNIZED:(term with spaces*) would give you no hit even with an not tokenized field "term with spaces and other useful things". The full solution would be to be able to tell the QP not to split at spaces, either by 'do not split till apos' syntax, or by the good ol' backslash: do\ not\ notice\ these\ spaces. incze --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]