You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by jf...@apache.org on 2004/02/17 04:59:56 UTC
cvs commit: jakarta-jetspeed/src/java/org/apache/jetspeed/services/search/lucene LuceneSearchService.java
jford 2004/02/16 19:59:56
Modified: src/java/org/apache/jetspeed/services/search/lucene
LuceneSearchService.java
Log:
Updated service implementation with field/keyword multimaps
Changed to MultifieldQueryParser
Finer grained exception handling and logging
Enhanced search results with more data
Revision Changes Path
1.6 +242 -68 jakarta-jetspeed/src/java/org/apache/jetspeed/services/search/lucene/LuceneSearchService.java
Index: LuceneSearchService.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed/src/java/org/apache/jetspeed/services/search/lucene/LuceneSearchService.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- LuceneSearchService.java 23 Jul 2003 19:50:23 -0000 1.5
+++ LuceneSearchService.java 17 Feb 2004 03:59:56 -0000 1.6
@@ -62,8 +62,12 @@
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
// Jetspeed imports
+import org.apache.commons.collections.MultiHashMap;
+import org.apache.commons.collections.MultiMap;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.search.HandlerFactory;
@@ -88,6 +92,8 @@
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.queryParser.MultiFieldQueryParser;
+import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Hits;
@@ -109,6 +115,9 @@
*/
private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(LuceneSearchService.class.getName());
+ private static final int KEYWORD = 0;
+ private static final int TEXT = 1;
+
private static final String CONFIG_DIRECTORY = "directory";
private File rootDir = null;
private String indexRoot = null;
@@ -248,16 +257,44 @@
{
Searcher searcher = null;
Hits hits = null;
+
try
{
searcher = new IndexSearcher(rootDir.getPath());
- Analyzer analyzer = new StandardAnalyzer();
- Query query = QueryParser.parse(searchString, ParsedObject.FIELDNAME_CONTENT, analyzer);
+ }
+ catch (IOException e)
+ {
+ logger.error("Failed to create index search using path " + rootDir.getPath());
+ return null;
+ }
+
+ Analyzer analyzer = new StandardAnalyzer();
+
+ String[] searchFields = {ParsedObject.FIELDNAME_CONTENT, ParsedObject.FIELDNAME_DESCRIPTION, ParsedObject.FIELDNAME_FIELDS,
+ ParsedObject.FIELDNAME_KEY, ParsedObject.FIELDNAME_KEYWORDS, ParsedObject.FIELDNAME_LANGUAGE,
+ ParsedObject.FIELDNAME_SCORE, ParsedObject.FIELDNAME_TITLE, ParsedObject.FIELDNAME_TYPE,
+ ParsedObject.FIELDNAME_URL, ParsedObject.FIELDNAME_CLASSNAME};
+
+ Query query= null;
+ try
+ {
+ query = MultiFieldQueryParser.parse(searchString, searchFields, analyzer);
+// Query query = QueryParser.parse(searchString, ParsedObject.FIELDNAME_CONTENT, analyzer);
+ }
+ catch (ParseException e)
+ {
+ logger.info("Failed to parse query " + searchString);
+ return null;
+ }
+
+ try
+ {
hits = searcher.search(query);
}
- catch (Exception e)
+ catch (IOException e)
{
- logger.error("Exception", e);
+ logger.error("Error while peforming search.", e);
+ return null;
}
// Copy hits to the result list
@@ -270,6 +307,8 @@
try
{
doc = hits.doc(counter);
+ addFieldsToParsedObject(doc, result);
+
result.setScore(hits.score(counter));
result.setType(doc.getField(ParsedObject.FIELDNAME_TYPE).stringValue());
result.setKey(doc.getField(ParsedObject.FIELDNAME_KEY).stringValue());
@@ -279,14 +318,14 @@
if (url != null)
{
result.setURL(new URL(url.stringValue()));
- }
+ }
+
results.add(counter, result);
}
catch (Exception ioe)
{
logger.error("Exception", ioe);
}
- result = null;
}
if (searcher != null)
@@ -302,6 +341,56 @@
}
return results;
}
+
+ private void addFieldsToParsedObject(Document doc, ParsedObject o)
+ {
+ try
+ {
+ MultiMap keywords = new MultiHashMap();
+ MultiMap multiFields = new MultiHashMap();
+
+ Field classNameField = doc.getField(ParsedObject.FIELDNAME_CLASSNAME);
+ if(classNameField != null)
+ {
+ String className = classNameField.stringValue();
+ ObjectHandler handler = HandlerFactory.getHandler(className);
+
+ Set fields = handler.getFields();
+ Iterator fieldIter = fields.iterator();
+ while(fieldIter.hasNext())
+ {
+ String fieldName = (String)fieldIter.next();
+ Field[] docFields = doc.getFields(fieldName);
+ if(fields != null)
+ {
+ for(int i=0; i<docFields.length; i++)
+ {
+ Field field = docFields[i];
+ if(field != null)
+ {
+ String value = field.stringValue();
+ if(field.isTokenized())
+ {
+ multiFields.put(fieldName, value);
+ }
+ else //it's a keyword
+ {
+ keywords.put(fieldName, value);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ o.setMultiKeywords(keywords);
+ o.setMultiFields(multiFields);
+ }
+ catch(Exception e)
+ {
+ logger.error("Error trying to add fields to parsed object.", e);
+ }
+ }
/**
*
@@ -320,7 +409,7 @@
*/
public boolean add(Object o)
{
- Collection c = new ArrayList();
+ Collection c = new ArrayList(1);
c.add(o);
return add(c);
@@ -336,82 +425,167 @@
{
boolean result = false;
- try
+ IndexWriter indexWriter;
+ try
{
- IndexWriter indexWriter = new IndexWriter(rootDir, new StandardAnalyzer(), false);
+ indexWriter = new IndexWriter(rootDir, new StandardAnalyzer(), false);
+ }
+ catch (IOException e)
+ {
+ logger.error("Error while creating index writer. Skipping add...", e);
+ return result;
+ }
- Iterator it = c.iterator();
- while (it.hasNext())
+ Iterator it = c.iterator();
+ while (it.hasNext())
+ {
+ Object o = it.next();
+ // Look up appropriate handler
+ ObjectHandler handler = null;
+ try
{
- Object o = it.next();
- // Look up appropriate handler
- ObjectHandler handler = HandlerFactory.getHandler(o);
+ handler = HandlerFactory.getHandler(o);
+ }
+ catch (Exception e)
+ {
+ logger.error("Failed to create hanlder for object " + o.getClass().getName());
+ continue;
+ }
- // Parse the object
- ParsedObject parsedObject = handler.parseObject(o);
+ // Parse the object
+ ParsedObject parsedObject = handler.parseObject(o);
- // Create document
- Document doc = new Document();
+ // Create document
+ Document doc = new Document();
- // Populate document from the parsed object
- if (parsedObject.getKey() != null)
- {
- doc.add(Field.Keyword(ParsedObject.FIELDNAME_KEY, parsedObject.getKey()));
- }
- if (parsedObject.getType() != null)
- {
- doc.add(Field.Text(ParsedObject.FIELDNAME_TYPE, parsedObject.getType()));
- }
- if (parsedObject.getTitle() != null)
- {
- doc.add(Field.Text(ParsedObject.FIELDNAME_TITLE, parsedObject.getTitle()));
- }
- if (parsedObject.getDescription() != null)
- {
- doc.add(Field.Text(ParsedObject.FIELDNAME_DESCRIPTION, parsedObject.getDescription()));
- }
- if (parsedObject.getContent() != null)
- {
- doc.add(Field.Text(ParsedObject.FIELDNAME_CONTENT, parsedObject.getContent()));
- }
- if (parsedObject.getLanguage() != null)
- {
- doc.add(Field.Text(ParsedObject.FIELDNAME_LANGUAGE, parsedObject.getLanguage()));
- }
- if (parsedObject.getURL() != null)
- {
- doc.add(Field.Text(ParsedObject.FIELDNAME_URL, parsedObject.getURL().toString()));
- }
+ // Populate document from the parsed object
+ if (parsedObject.getKey() != null)
+ {
+ doc.add(Field.Keyword(ParsedObject.FIELDNAME_KEY, parsedObject.getKey()));
+ }
+ if (parsedObject.getType() != null)
+ {
+ doc.add(Field.Text(ParsedObject.FIELDNAME_TYPE, parsedObject.getType()));
+ }
+ if (parsedObject.getTitle() != null)
+ {
+ doc.add(Field.Text(ParsedObject.FIELDNAME_TITLE, parsedObject.getTitle()));
+ }
+ if (parsedObject.getDescription() != null)
+ {
+ doc.add(Field.Text(ParsedObject.FIELDNAME_DESCRIPTION, parsedObject.getDescription()));
+ }
+ if (parsedObject.getContent() != null)
+ {
+ doc.add(Field.Text(ParsedObject.FIELDNAME_CONTENT, parsedObject.getContent()));
+ }
+ if (parsedObject.getLanguage() != null)
+ {
+ doc.add(Field.Text(ParsedObject.FIELDNAME_LANGUAGE, parsedObject.getLanguage()));
+ }
+ if (parsedObject.getURL() != null)
+ {
+ doc.add(Field.Text(ParsedObject.FIELDNAME_URL, parsedObject.getURL().toString()));
+ }
+ if(parsedObject.getClassName() != null)
+ {
+ doc.add(Field.Text(ParsedObject.FIELDNAME_CLASSNAME, parsedObject.getClassName()));
+ }
- // TODO: How to handle keywords and fields
- /*String[] keywords = parsedObject.getKeywords();
- if (keywords != null)
- {
- for (int i = 0; i < keywords.length; i++)
- {
- doc.add(Field.Keyword();
- }
- } */
+ MultiMap multiKeywords = parsedObject.getMultiKeywords();
+ addFieldsToDocument(doc, multiKeywords, KEYWORD);
+
+ MultiMap multiFields = parsedObject.getMultiFields();
+ addFieldsToDocument(doc, multiFields, TEXT);
+
+ Map fields = parsedObject.getFields();
+ addFieldsToDocument(doc, fields, TEXT);
- // Add the document to search index
+ // Add the document to search index
+ try
+ {
indexWriter.addDocument(doc);
- logger.debug("Index Document Count = " + indexWriter.docCount());
- logger.info("Added '" + parsedObject.getTitle() + "' to index");
- result = true;
}
+ catch (IOException e)
+ {
+ logger.error("Error adding document to index.", e);
+ }
+ logger.debug("Index Document Count = " + indexWriter.docCount());
+ logger.info("Added '" + parsedObject.getTitle() + "' to index");
+ result = true;
+ }
+ try
+ {
indexWriter.optimize();
- indexWriter.close();
-
}
- catch (Exception e)
+ catch (IOException e)
{
- logger.error("Exception", e);
- result = false;
+ logger.error("Error while trying to optimize index.");
+ }
+ finally
+ {
+ try
+ {
+ indexWriter.close();
+ }
+ catch (IOException e)
+ {
+ logger.error("Error while closing index writer.", e);
+ }
}
return result;
}
+
+ private void addFieldsToDocument(Document doc, Map fields, int type)
+ {
+ if(fields != null)
+ {
+ Iterator keyIter = fields.keySet().iterator();
+ while(keyIter.hasNext())
+ {
+ Object key = keyIter.next();
+ if(key != null)
+ {
+ Object values = fields.get(key);
+ if(values != null)
+ {
+ if(values instanceof Collection)
+ {
+ Iterator valueIter = ((Collection)values).iterator();
+ while(valueIter.hasNext())
+ {
+ Object value = valueIter.next();
+ if(value != null)
+ {
+ if(type == TEXT)
+ {
+ doc.add(Field.Text(key.toString(), value.toString()));
+ }
+ else
+ {
+ doc.add(Field.Keyword(key.toString(), value.toString()));
+ }
+ }
+ }
+ }
+ else
+ {
+ if(type == TEXT)
+ {
+ doc.add(Field.Text(key.toString(), values.toString()));
+ }
+ else
+ {
+ doc.add(Field.Keyword(key.toString(), values.toString()));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
/**
*
@@ -421,7 +595,7 @@
*/
public boolean remove(Object o)
{
- Collection c = new ArrayList();
+ Collection c = new ArrayList(1);
c.add(o);
return remove(c);
@@ -489,7 +663,7 @@
*/
public boolean update(Object o)
{
- Collection c = new ArrayList();
+ Collection c = new ArrayList(1);
c.add(o);
return update(c);
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jetspeed-dev-help@jakarta.apache.org