Author: woonsan
Date: Sat Jul 24 00:13:19 2010
New Revision: 967312
URL: http://svn.apache.org/viewvc?rev=967312&view=rev
Log:
JS2-1198: A refactoring in search engine impl.
Because adding a ParsedObject item includes removing the existing one with same
key, adding does the same as updating.
Also, optimization during adding or removing by reducing index-rewriting calls.
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/serializer/JetspeedRegistrySerializer.java
portals/jetspeed-2/portal/trunk/components/jetspeed-search/src/main/java/org/apache/jetspeed/search/lucene/SearchEngineImpl.java
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/search/SearchEngine.java
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
URL:
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java?rev=967312&r1=967311&r2=967312&view=diff
==============================================================================
---
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
(original)
+++
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/tools/pamanager/PortletApplicationManager.java
Sat Jul 24 00:13:19 2010
@@ -21,14 +21,13 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.apache.jetspeed.cluster.NodeManager;
import org.apache.jetspeed.components.portletregistry.PortletRegistry;
import org.apache.jetspeed.components.portletregistry.RegistryException;
import org.apache.jetspeed.descriptor.JetspeedDescriptorService;
import org.apache.jetspeed.factory.PortletFactory;
import org.apache.jetspeed.om.portlet.PortletApplication;
+import org.apache.jetspeed.om.portlet.PortletDefinition;
import org.apache.jetspeed.om.portlet.SecurityRole;
import org.apache.jetspeed.search.SearchEngine;
import org.apache.jetspeed.security.JetspeedPermission;
@@ -40,6 +39,8 @@ import org.apache.jetspeed.util.Director
import org.apache.jetspeed.util.FileSystemHelper;
import org.apache.jetspeed.util.MultiFileChecksumHelper;
import org.apache.jetspeed.util.descriptor.PortletApplicationWar;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* PortletApplicationManager
@@ -717,21 +718,26 @@ public class PortletApplicationManager i
{
if (searchEngine != null)
{
+ List<PortletDefinition> portletDefList = pa.getPortlets();
+ List<Object> list = new ArrayList<Object>(portletDefList.size() +
1);
+
if (remove)
{
- searchEngine.remove(pa);
- searchEngine.remove(pa.getPortlets());
+ list.addAll(portletDefList);
+ list.add(pa);
+ searchEngine.remove(list);
log.info("Un-Registered the portlet application in the search
engine... " + pa.getName());
}
else
{
- searchEngine.add(pa);
- searchEngine.add(pa.getPortlets());
+ list.add(pa);
+ list.addAll(portletDefList);
+ searchEngine.add(list);
log.info("Registered the portlet application in the search
engine... " + pa.getName());
}
}
-
}
+
protected void unregisterPortletApplication(PortletApplication pa,
boolean purgeEntityInfo)
throws RegistryException
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/serializer/JetspeedRegistrySerializer.java
URL:
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/serializer/JetspeedRegistrySerializer.java?rev=967312&r1=967311&r2=967312&view=diff
==============================================================================
---
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/serializer/JetspeedRegistrySerializer.java
(original)
+++
portals/jetspeed-2/portal/trunk/components/jetspeed-registry/src/main/java/org/apache/jetspeed/serializer/JetspeedRegistrySerializer.java
Sat Jul 24 00:13:19 2010
@@ -15,6 +15,7 @@
*/
package org.apache.jetspeed.serializer;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
@@ -108,8 +109,10 @@ public class JetspeedRegistrySerializer
List<PortletDefinition> portlets = pa.getPortlets();
if (searchEngine != null)
{
- searchEngine.remove(pa);
- searchEngine.remove(portlets);
+ List<Object> list = new
ArrayList<Object>(portlets.size() + 1);
+ list.add(pa);
+ list.addAll(portlets);
+ searchEngine.remove(list);
}
registry.removeApplication(pa);
}
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-search/src/main/java/org/apache/jetspeed/search/lucene/SearchEngineImpl.java
URL:
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-search/src/main/java/org/apache/jetspeed/search/lucene/SearchEngineImpl.java?rev=967312&r1=967311&r2=967312&view=diff
==============================================================================
---
portals/jetspeed-2/portal/trunk/components/jetspeed-search/src/main/java/org/apache/jetspeed/search/lucene/SearchEngineImpl.java
(original)
+++
portals/jetspeed-2/portal/trunk/components/jetspeed-search/src/main/java/org/apache/jetspeed/search/lucene/SearchEngineImpl.java
Sat Jul 24 00:13:19 2010
@@ -158,185 +158,11 @@ public class SearchEngineImpl implements
/* (non-Javadoc)
* @see org.apache.jetspeed.search.SearchEnging#add(java.util.Collection)
*/
- public synchronized boolean add(Collection objects)
+ public boolean add(Collection objects)
{
- IndexWriter indexWriter = null;
- IndexReader indexReader = null;
- Searcher searcher = null;
-
- try
- {
- Iterator it = objects.iterator();
- while (it.hasNext())
- {
- if (indexWriter == null)
- {
- indexWriter = new IndexWriter(directory, analyzer, false,
IndexWriter.MaxFieldLength.UNLIMITED);
- indexReader = indexWriter.getReader();
- searcher = new IndexSearcher(indexReader);
- }
-
- Object o = it.next();
- // Look up appropriate handler
- ObjectHandler handler = null;
- try
- {
- handler = handlerFactory.getHandler(o);
- }
- catch (Exception e)
- {
- log.error("Failed to create hanlder for object " +
o.getClass().getName());
- continue;
- }
-
- // Parse the object
- ParsedObject parsedObject = handler.parseObject(o);
-
- String key = parsedObject.getKey();
- // if there's an existing one with the same key, then remove
it first.
- if (parsedObject.getKey() != null)
- {
- Term keyTerm = new Term(ParsedObject.FIELDNAME_KEY, key);
- TopDocs topDocs = searcher.search(new TermQuery(keyTerm),
1);
- if (topDocs.totalHits > 0)
- {
- indexWriter.deleteDocuments(keyTerm);
- }
- }
-
- String type = parsedObject.getType();
- String title = parsedObject.getTitle();
- String description = parsedObject.getDescription();
- String content = parsedObject.getContent();
- String language = parsedObject.getLanguage();
- URL url = parsedObject.getURL();
- String className = parsedObject.getClassName();
-
- // Create document
- Document doc = new Document();
-
- // Populate document from the parsed object
- if (key != null)
- {
- doc.add(new Field(ParsedObject.FIELDNAME_KEY, key,
Field.Store.YES, Field.Index.NOT_ANALYZED));
- }
- if (type != null)
- {
- doc.add(new Field(ParsedObject.FIELDNAME_TYPE, type,
Field.Store.YES, Field.Index.ANALYZED));
- }
- if (title != null)
- {
- doc.add(new Field(ParsedObject.FIELDNAME_TITLE, title,
Field.Store.YES, Field.Index.ANALYZED));
- }
- if (description != null)
- {
- doc.add(new Field(ParsedObject.FIELDNAME_DESCRIPTION,
description, Field.Store.YES, Field.Index.ANALYZED));
- }
- if (content != null)
- {
- doc.add(new Field(ParsedObject.FIELDNAME_CONTENT, content,
Field.Store.NO, Field.Index.ANALYZED));
- }
- if (language != null)
- {
- doc.add(new Field(ParsedObject.FIELDNAME_LANGUAGE,
language, Field.Store.YES, Field.Index.ANALYZED));
- }
- if (url != null)
- {
- String urlString = url.toString();
- doc.add(new Field(ParsedObject.FIELDNAME_URL, urlString,
Field.Store.YES, Field.Index.ANALYZED));
- }
- if (className != null)
- {
- doc.add(new Field(ParsedObject.FIELDNAME_CLASSNAME,
className, Field.Store.YES, Field.Index.ANALYZED));
- }
-
- String[] keywordArray = parsedObject.getKeywords();
- if(keywordArray != null)
- {
- for(int i=0; i<keywordArray.length; ++i)
- {
- String keyword = keywordArray[i];
- doc.add(new
Field(ParsedObject.FIELDNAME_KEYWORDS, keyword, Field.Store.YES,
Field.Index.NOT_ANALYZED));
- }
- }
-
- Map keywords = parsedObject.getKeywordsMap();
- addFieldsToDocument(doc, keywords, KEYWORD);
-
- Map fields = parsedObject.getFields();
- addFieldsToDocument(doc, fields, TEXT);
-
- List<String> syntheticField = new ArrayList<String>();
- for (Fieldable fieldable : doc.getFields())
- {
- String value = fieldable.stringValue();
- if (value != null)
- {
- syntheticField.add(value);
- }
- }
- doc.add(new Field(ParsedObject.FIELDNAME_SYNTHETIC,
StringUtils.join(syntheticField, ' '), Field.Store.NO, Field.Index.ANALYZED));
-
- // Add the document to search index
- indexWriter.addDocument(doc);
- //logger.debug("Index Document Count = " +
indexWriter.docCount());
- //logger.info("Added '" + parsedObject.getTitle() + "' to
index");
- }
-
- if (objects.size() > 0 && optimizeAfterUpdate && indexWriter !=
null)
- {
- try
- {
- indexWriter.optimize();
- }
- catch (IOException e)
- {
- log.error("Error while trying to optimize index.", e);
- }
- }
- }
- catch (IOException e)
- {
- log.error("Error while writing index.", e);
- return false;
- }
- finally
- {
- if (searcher != null)
- {
- try
- {
- searcher.close();
- }
- catch (IOException ce)
- {
- }
- }
- if (indexReader != null)
- {
- try
- {
- indexReader.close();
- }
- catch (IOException ce)
- {
- }
- }
- if (indexWriter != null)
- {
- try
- {
- indexWriter.close();
- }
- catch (IOException ce)
- {
- }
- }
- }
-
- return true;
+ return removeIfExistsAndAdd(objects);
}
-
+
/* (non-Javadoc)
* @see org.apache.jetspeed.search.SearchEnging#remove(java.lang.Object)
*/
@@ -432,36 +258,9 @@ public class SearchEngineImpl implements
/* (non-Javadoc)
* @see
org.apache.jetspeed.search.SearchEnging#update(java.util.Collection)
*/
- public synchronized boolean update(Collection objects)
+ public boolean update(Collection objects)
{
- boolean result = false;
-
- try
- {
- // Delete entries from index
- remove(objects);
- result = true;
- }
- catch (Throwable e)
- {
- //logger.error("Exception", e);
- }
-
- try
- {
- // Add entries to index
- if(result)
- {
- add(objects);
- result = true;
- }
- }
- catch (Throwable e)
- {
- //logger.error("Exception", e);
- }
-
- return result;
+ return removeIfExistsAndAdd(objects);
}
/* (non-Javadoc)
@@ -638,6 +437,185 @@ public class SearchEngineImpl implements
return (results != null ? results : new SearchResultsImpl(new
ArrayList<ParsedObject>()));
}
+ private synchronized boolean removeIfExistsAndAdd(Collection objects)
+ {
+ IndexWriter indexWriter = null;
+ IndexReader indexReader = null;
+ Searcher searcher = null;
+
+ try
+ {
+ Iterator it = objects.iterator();
+ while (it.hasNext())
+ {
+ if (indexWriter == null)
+ {
+ indexWriter = new IndexWriter(directory, analyzer, false,
IndexWriter.MaxFieldLength.UNLIMITED);
+ indexReader = indexWriter.getReader();
+ searcher = new IndexSearcher(indexReader);
+ }
+
+ Object o = it.next();
+ // Look up appropriate handler
+ ObjectHandler handler = null;
+ try
+ {
+ handler = handlerFactory.getHandler(o);
+ }
+ catch (Exception e)
+ {
+ log.error("Failed to create hanlder for object " +
o.getClass().getName());
+ continue;
+ }
+
+ // Parse the object
+ ParsedObject parsedObject = handler.parseObject(o);
+
+ String key = parsedObject.getKey();
+ // if there's an existing one with the same key, then remove
it first.
+ if (parsedObject.getKey() != null)
+ {
+ Term keyTerm = new Term(ParsedObject.FIELDNAME_KEY, key);
+ TopDocs topDocs = searcher.search(new TermQuery(keyTerm),
1);
+ if (topDocs.totalHits > 0)
+ {
+ indexWriter.deleteDocuments(keyTerm);
+ }
+ }
+
+ String type = parsedObject.getType();
+ String title = parsedObject.getTitle();
+ String description = parsedObject.getDescription();
+ String content = parsedObject.getContent();
+ String language = parsedObject.getLanguage();
+ URL url = parsedObject.getURL();
+ String className = parsedObject.getClassName();
+
+ // Create document
+ Document doc = new Document();
+
+ // Populate document from the parsed object
+ if (key != null)
+ {
+ doc.add(new Field(ParsedObject.FIELDNAME_KEY, key,
Field.Store.YES, Field.Index.NOT_ANALYZED));
+ }
+ if (type != null)
+ {
+ doc.add(new Field(ParsedObject.FIELDNAME_TYPE, type,
Field.Store.YES, Field.Index.ANALYZED));
+ }
+ if (title != null)
+ {
+ doc.add(new Field(ParsedObject.FIELDNAME_TITLE, title,
Field.Store.YES, Field.Index.ANALYZED));
+ }
+ if (description != null)
+ {
+ doc.add(new Field(ParsedObject.FIELDNAME_DESCRIPTION,
description, Field.Store.YES, Field.Index.ANALYZED));
+ }
+ if (content != null)
+ {
+ doc.add(new Field(ParsedObject.FIELDNAME_CONTENT, content,
Field.Store.NO, Field.Index.ANALYZED));
+ }
+ if (language != null)
+ {
+ doc.add(new Field(ParsedObject.FIELDNAME_LANGUAGE,
language, Field.Store.YES, Field.Index.ANALYZED));
+ }
+ if (url != null)
+ {
+ String urlString = url.toString();
+ doc.add(new Field(ParsedObject.FIELDNAME_URL, urlString,
Field.Store.YES, Field.Index.ANALYZED));
+ }
+ if (className != null)
+ {
+ doc.add(new Field(ParsedObject.FIELDNAME_CLASSNAME,
className, Field.Store.YES, Field.Index.ANALYZED));
+ }
+
+ String[] keywordArray = parsedObject.getKeywords();
+ if(keywordArray != null)
+ {
+ for(int i=0; i<keywordArray.length; ++i)
+ {
+ String keyword = keywordArray[i];
+ doc.add(new Field(ParsedObject.FIELDNAME_KEYWORDS,
keyword, Field.Store.YES, Field.Index.NOT_ANALYZED));
+ }
+ }
+
+ Map keywords = parsedObject.getKeywordsMap();
+ addFieldsToDocument(doc, keywords, KEYWORD);
+
+ Map fields = parsedObject.getFields();
+ addFieldsToDocument(doc, fields, TEXT);
+
+ List<String> syntheticField = new ArrayList<String>();
+ for (Fieldable fieldable : doc.getFields())
+ {
+ String value = fieldable.stringValue();
+ if (value != null)
+ {
+ syntheticField.add(value);
+ }
+ }
+ doc.add(new Field(ParsedObject.FIELDNAME_SYNTHETIC,
StringUtils.join(syntheticField, ' '), Field.Store.NO, Field.Index.ANALYZED));
+
+ // Add the document to search index
+ indexWriter.addDocument(doc);
+ //logger.debug("Index Document Count = " +
indexWriter.docCount());
+ //logger.info("Added '" + parsedObject.getTitle() + "' to
index");
+ }
+
+ if (objects.size() > 0 && optimizeAfterUpdate && indexWriter !=
null)
+ {
+ try
+ {
+ indexWriter.optimize();
+ }
+ catch (IOException e)
+ {
+ log.error("Error while trying to optimize index.", e);
+ }
+ }
+ }
+ catch (IOException e)
+ {
+ log.error("Error while writing index.", e);
+ return false;
+ }
+ finally
+ {
+ if (searcher != null)
+ {
+ try
+ {
+ searcher.close();
+ }
+ catch (IOException ce)
+ {
+ }
+ }
+ if (indexReader != null)
+ {
+ try
+ {
+ indexReader.close();
+ }
+ catch (IOException ce)
+ {
+ }
+ }
+ if (indexWriter != null)
+ {
+ try
+ {
+ indexWriter.close();
+ }
+ catch (IOException ce)
+ {
+ }
+ }
+ }
+
+ return true;
+ }
+
private void addFieldsToDocument(Document doc, Map fields, int type)
{
if(fields != null)
Modified:
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/search/SearchEngine.java
URL:
http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/search/SearchEngine.java?rev=967312&r1=967311&r2=967312&view=diff
==============================================================================
---
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/search/SearchEngine.java
(original)
+++
portals/jetspeed-2/portal/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/search/SearchEngine.java
Sat Jul 24 00:13:19 2010
@@ -24,23 +24,98 @@ import java.util.Collection;
*/
public interface SearchEngine
{
+ /**
+ * Adds search index document for the argument object.
+ * An object handler for the object type is responsible for parsing.
+ * <BR/>
+ * <P>
+ * <EM>Note: Normally, it is more efficient to invoke {...@link
#add(Collection)}.</EM>
+ * </P>
+ * @param o
+ * @return
+ * @see {...@link org.apache.jetspeed.search.ObjectHandler}
+ * @see {...@link org.apache.jetspeed.search.ParsedObject}
+ */
boolean add(Object o);
+ /**
+ * Adds search index documents for the argument object collection.
+ * Each object handler for the object type of each item is responsible for
parsing.
+ * @param objects
+ * @return
+ */
boolean add(Collection objects);
+ /**
+ * Removes search index document for the argument object.
+ * An object handler for the object type is responsible for parsing.
+ * <BR/>
+ * <P>
+ * <EM>Note: Normally, it is more efficient to invoke {...@link
#remove(Collection)}.</EM>
+ * </P>
+ * @param o
+ * @return
+ */
boolean remove(Object o);
+ /**
+ * Removes search index documents for the argument object collection.
+ * Each object handler for the object type of each item is responsible for
parsing.
+ * @param objects
+ * @return
+ */
boolean remove(Collection objects);
+ /**
+ * Updates the search index document for the argument object.
+ * An object handler for the object type is responsible for parsing.
+ * <BR/>
+ * <P>
+ * <EM>Note: Normally, it is more efficient to invoke {...@link
#update(Collection)}.</EM>
+ * </P>
+ * @param o
+ * @return
+ */
boolean update(Object o);
+ /**
+ * Updates the search index documents for the argument object collection.
+ * Each object handler for the object type of each item is responsible for
parsing.
+ * @param objects
+ * @return
+ */
boolean update(Collection objects);
+ /**
+ * Requests optimization
+ * @return
+ */
boolean optimize();
+ /**
+ * Searches documents by the query.
+ * The default field name and the default top hits count can be used in a
specific implementation.
+ * @param query
+ * @return
+ */
SearchResults search(String query);
+ /**
+ * Searches documents by the query against the default field name.
+ * The default top hits count can be used in a specific implementation.
+ * @param query
+ * @param defaultFieldName
+ * @return
+ */
SearchResults search(String query, String defaultFieldName);
+ /**
+ * Searches documents by the query against the default field name.
+ * The returned item count will not be more than topHitsCount.
+ * @param query
+ * @param defaultFieldName
+ * @param topHitsCount
+ * @return
+ */
SearchResults search(String query, String defaultFieldName, int
topHitsCount);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]