Update of /var/cvs/contributions/lucene/src/org/mmbase/module/lucene
In directory james.mmbase.org:/tmp/cvs-serv17877/org/mmbase/module/lucene

Modified Files:
        Indexer.java Lucene.java MMBaseEntry.java 
        MMBaseIndexDefinition.java NewSearcher.java Searcher.java 
Log Message:



See also: 
http://cvs.mmbase.org/viewcvs/contributions/lucene/src/org/mmbase/module/lucene


Index: Indexer.java
===================================================================
RCS file: 
/var/cvs/contributions/lucene/src/org/mmbase/module/lucene/Indexer.java,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -b -r1.51 -r1.52
--- Indexer.java        29 Jan 2008 09:52:36 -0000      1.51
+++ Indexer.java        1 Feb 2008 11:08:21 -0000       1.52
@@ -34,7 +34,7 @@
  *
  * @author Pierre van Rooden
  * @author Michiel Meeuwissen
- * @version $Id: Indexer.java,v 1.51 2008/01/29 09:52:36 michiel Exp $
+ * @version $Id: Indexer.java,v 1.52 2008/02/01 11:08:21 michiel Exp $
  **/
 public class Indexer {
 
@@ -298,7 +298,7 @@
         } finally {
             if (writer != null) try { writer.close();} catch (IOException ioe) 
{ log.error(ioe); }
         }
-        EventManager.getInstance().propagateEvent(NewSearcher.EVENT);
+        EventManager.getInstance().propagateEvent(new 
NewSearcher.Event(getName()));
         return updated;
     }
 
@@ -428,14 +428,14 @@
             writer.optimize();
             Directory.copy(fullIndex, getDirectory(), true);
             Date lastFullIndex = setLastFullIndex(startTime);
-            log.service("Full index finished at " + lastFullIndex + ". Total 
nr documents in index '" + getName() + "': " + writer.docCount());
+            log.info("Full index finished at " + lastFullIndex + ". Copied " + 
fullIndex + " to " + getDirectory() + " Total nr documents in index '" + 
getName() + "': " + writer.docCount());
         } catch (Exception e) {
             addError(e.getMessage());
             log.error("Cannot run FullIndex: " + e.getMessage(), e);
         } finally {
             if (writer != null) { try { writer.close(); } catch (IOException 
ioe) { log.error("Can't close index writer: " + ioe.getMessage()); } }
         }
-        EventManager.getInstance().propagateEvent(NewSearcher.EVENT);
+        EventManager.getInstance().propagateEvent(new 
NewSearcher.Event(getName()));
     }
 
     /**
@@ -462,10 +462,15 @@
                 document = new Document();
                 document.add(new Field("indexId", indexId,  Field.Store.YES, 
Field.Index.UN_TOKENIZED));
                 indexed++;
+                if (indexed % 100 == 0) {
+                    log.service("Indexed " + indexed + " documents");
+                } else if (log.isDebugEnabled()) {
+                    log.debug("Indexed " + indexed + " documents");
+                }
             }
             index(entry, document);
             if (Thread.currentThread().isInterrupted()) {
-                log.debug("Interrupted");
+                log.info("Interrupted");
                 break;
             }
             lastIdentifier = newIdentifier;
@@ -476,7 +481,7 @@
             }
             writer.addDocument(document);
         }
-        EventManager.getInstance().propagateEvent(NewSearcher.EVENT);
+        EventManager.getInstance().propagateEvent(new 
NewSearcher.Event(getName()));
         return indexed;
     }
 


Index: Lucene.java
===================================================================
RCS file: 
/var/cvs/contributions/lucene/src/org/mmbase/module/lucene/Lucene.java,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -b -r1.104 -r1.105
--- Lucene.java 14 Jan 2008 18:33:35 -0000      1.104
+++ Lucene.java 1 Feb 2008 11:08:21 -0000       1.105
@@ -35,6 +35,7 @@
 
 import java.util.concurrent.*;
 
+import org.apache.lucene.store.Directory;
 import org.apache.lucene.analysis.StopAnalyzer;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.search.BooleanQuery;
@@ -47,7 +48,7 @@
  *
  * @author Pierre van Rooden
  * @author Michiel Meeuwissen
- * @version $Id: Lucene.java,v 1.104 2008/01/14 18:33:35 michiel Exp $
+ * @version $Id: Lucene.java,v 1.105 2008/02/01 11:08:21 michiel Exp $
  **/
 public class Lucene extends ReloadableModule implements NodeEventListener, 
RelationEventListener, IdEventListener {
 
@@ -466,6 +467,33 @@
     }
 
 
+    protected Function/*<Void>*/ clearDirectory = new 
AbstractFunction/*<Void>*/("clearDirectory", new Parameter[] {INDEX, COPY}, 
ReturnType.VOID) {
+        public Object getFunctionValue(Parameters arguments) {
+            String index = (String) arguments.getString(INDEX);
+            Indexer indexer = indexerMap.get(index);
+            boolean copy = Boolean.TRUE.equals(arguments.get(COPY));
+            try {
+                Directory dir = copy ? indexer.getDirectoryForFullIndex(): 
indexer.getDirectory();
+                for (String file : dir.list()) {
+                    if (file != null) {
+                        try {
+                            dir.deleteFile(file);
+                        } catch (Exception e) {
+                            log.warn(e);
+                        }
+                    }
+                }
+                if (! copy)  EventManager.getInstance().propagateEvent(new 
NewSearcher.Event(index));
+            } catch (java.io.IOException ioe) {
+                throw new RuntimeException(ioe);
+            }
+            return null;
+        }
+        };
+    {
+        addFunction(clearDirectory);
+    }
+
     //protected Function<Integer> unAssignFunction = new 
AbstractFunction<Integer>("unassign", new Parameter("id", Integer.class, true)) 
{
     protected Function/*<Integer>*/ unAssignFunction = new 
AbstractFunction/*<Integer>*/("unassign", new Parameter[] {new Parameter("id", 
Integer.class, true)}, ReturnType.INTEGER) {
             public Integer getFunctionValue(Parameters arguments) {
@@ -502,6 +530,8 @@
         addFunction(interruptFunction);
     }
 
+
+
     //protected Function<Date> lastFullIndexFunction = new 
AbstractFunction<Date>("last", INDEX) {
     protected Function/*<Date>*/ lastFullIndexFunction = new 
AbstractFunction/*<Date>*/("last", new Parameter[] {INDEX}, ReturnType.UNKNOWN) 
{
         public Date getFunctionValue(Parameters arguments) {


Index: MMBaseEntry.java
===================================================================
RCS file: 
/var/cvs/contributions/lucene/src/org/mmbase/module/lucene/MMBaseEntry.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- MMBaseEntry.java    27 Dec 2007 13:25:00 -0000      1.29
+++ MMBaseEntry.java    1 Feb 2008 11:08:21 -0000       1.30
@@ -34,7 +34,7 @@
  *
  * @author Pierre van Rooden
  * @author Michiel Meeuwissen
- * @version $Id: MMBaseEntry.java,v 1.29 2007/12/27 13:25:00 pierre Exp $
+ * @version $Id: MMBaseEntry.java,v 1.30 2008/02/01 11:08:21 michiel Exp $
  **/
 public class MMBaseEntry implements IndexEntry {
     static private final Logger log = 
Logging.getLoggerInstance(MMBaseEntry.class);
@@ -126,12 +126,13 @@
                 String value = getFieldDataAsString(data, fieldName);
                 if (fieldDefinition.escaper != null) {
                    org.mmbase.util.transformers.CharTransformer transformer = 
null;
-                   try {
-                     transformer = 
org.mmbase.bridge.jsp.taglib.ContentTag.getCharTransformer(fieldDefinition.escaper,null);
                  
-                   } catch (javax.servlet.jsp.JspTagException jte) {
+                   //try {
+                       transformer = null;
+                       
//org.mmbase.bridge.jsp.taglib.ContentTag.getCharTransformer(fieldDefinition.escaper,
 null);
+                       //} catch (javax.servlet.jsp.JspTagException jte) {
                       // ignore if an escaper does not exist for now 
(otherwise log fills up)
-                   }
-                   if (transformer !=null) {
+                       //}
+                   if (transformer != null) {
                      value = transformer.transform(value);
                    }
                 }


Index: MMBaseIndexDefinition.java
===================================================================
RCS file: 
/var/cvs/contributions/lucene/src/org/mmbase/module/lucene/MMBaseIndexDefinition.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- MMBaseIndexDefinition.java  18 Dec 2007 12:17:11 -0000      1.22
+++ MMBaseIndexDefinition.java  1 Feb 2008 11:08:21 -0000       1.23
@@ -26,7 +26,7 @@
  * fields can have extra attributes specific to Lucene searching.
  *
  * @author Pierre van Rooden
- * @version $Id: MMBaseIndexDefinition.java,v 1.22 2007/12/18 12:17:11 pierre 
Exp $
+ * @version $Id: MMBaseIndexDefinition.java,v 1.23 2008/02/01 11:08:21 michiel 
Exp $
  **/
 class MMBaseIndexDefinition extends QueryDefinition implements IndexDefinition 
{
     static private final Logger log = 
Logging.getLoggerInstance(MMBaseIndexDefinition.class);
@@ -55,7 +55,12 @@
 
     private final Map<String, Float> boosts = new HashMap<String, Float>();
  
-    private final BasicReleaseStrategy releaseStrategy = new 
BasicReleaseStrategy();
+    private final ChainedReleaseStrategy releaseStrategy = new 
ChainedReleaseStrategy();
+    {
+        releaseStrategy.addReleaseStrategy(new BetterStrategy());
+        releaseStrategy.addReleaseStrategy(new ConstraintsMatchingStrategy());
+    }
+
 
     MMBaseIndexDefinition() {
     }
@@ -98,9 +103,16 @@
 
     public boolean inIndex(String identifier) {
         Cloud cloud = query.getCloud();
-        if (! cloud.hasNode(identifier)) return false;
+        if (! cloud.hasNode(identifier)) {
+            log.debug("No such node " + identifier + " (" + getId() + ")");
+            return false;
+        }
         Node node = cloud.getNode(identifier);
-       return 
releaseStrategy.evaluate(NodeEventHelper.createNodeEventInstance(node, 
Event.TYPE_NEW, null), query, null).shouldRelease();
+        NodeEvent pseudoEvent = new NodeEvent(null, 
node.getNodeManager().getName(), node.getNumber(), Collections.EMPTY_MAP,
+                                              new NodeMap(node), 
Event.TYPE_CHANGE);
+        boolean result =  releaseStrategy.evaluate(pseudoEvent, query, 
null).shouldRelease();
+        log.debug("Node " + identifier + (result ? " IS " : " IS NOT ") + "in 
index " + getId() + " according to " + releaseStrategy);
+        return result;
     }
     /**
      * Converts an MMBase Node Iterator to an Iterator of IndexEntry-s.
@@ -177,8 +189,8 @@
             }
             StepField elementNumberField = 
q.createStepField(elementNumberFieldName);
             q.addSortOrder(elementNumberField, SortOrder.ORDER_DESCENDING); // 
this sort order makes it possible to filter out duplicates.
-            if (log.isDebugEnabled()) {
-                log.debug("Query for node '" + id + "': " + q.toSql());
+            if (log.isTraceEnabled()) {
+                log.trace("Query for node '" + id + "': " + q.toSql());
             }
             return new HugeNodeListIterator(q, maxNodesInQuery);
         } catch (Exception e) {


Index: NewSearcher.java
===================================================================
RCS file: 
/var/cvs/contributions/lucene/src/org/mmbase/module/lucene/NewSearcher.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- NewSearcher.java    17 Jan 2007 22:00:14 -0000      1.3
+++ NewSearcher.java    1 Feb 2008 11:08:21 -0000       1.4
@@ -15,23 +15,25 @@
  * All the code necessary to propagate events with the meaning 'the lucene 
index has changed, you must refresh your searchers'.
  * @since  MMBase-1.9
  * @author Michiel Meeuwissen
- * @version $Id: NewSearcher.java,v 1.3 2007/01/17 22:00:14 michiel Exp $
+ * @version $Id: NewSearcher.java,v 1.4 2008/02/01 11:08:21 michiel Exp $
  */
 
 public class NewSearcher {
 
-    /**
-     * The event itself
-     */
     public static class Event extends org.mmbase.core.event.Event {
-        private Event() {};
 
-    }
+        protected final String index;
     /**
-     * No further structure, so it can as well be a singleton
+         * The event itself
      */
-    public static Event EVENT = new Event();
+        public Event(String i) {
+            index = i;
+        };
+        public String getIndex() {
+            return index;
+        }
 
+    }
 
     /**
      * The associated listener


Index: Searcher.java
===================================================================
RCS file: 
/var/cvs/contributions/lucene/src/org/mmbase/module/lucene/Searcher.java,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -b -r1.43 -r1.44
--- Searcher.java       14 Jan 2008 17:49:48 -0000      1.43
+++ Searcher.java       1 Feb 2008 11:08:21 -0000       1.44
@@ -33,7 +33,7 @@
  * A wrapper around Lucene's [EMAIL PROTECTED] 
org.apache.lucene.search.IndexSearcher}. Every [EMAIL PROTECTED] Indexer} has 
its own Searcher.
  *
  * @author Pierre van Rooden
- * @version $Id: Searcher.java,v 1.43 2008/01/14 17:49:48 michiel Exp $
+ * @version $Id: Searcher.java,v 1.44 2008/02/01 11:08:21 michiel Exp $
  * @todo  Should the StopAnalyzers be replaced by index.analyzer? Something 
else?
  **/
 public class Searcher implements NewSearcher.Listener {
@@ -62,24 +62,23 @@
         this.index = index;
         searchLog = Logging.getLoggerInstance("org.mmbase.lucene.SEARCH." + 
index.getName());
         this.allIndexedFields = allIndexedFields;
-        try {
-            searcher = new IndexSearcher(index.getDirectory());
-        } catch (IOException ioe) {
-            log.error("Can't close index searcher: " + ioe.getMessage());
-        }
         EventManager.getInstance().addEventListener(this);
     }
 
     public void notify(NewSearcher.Event event) {
+        if (event.getIndex().equals(index.getName())) {
+            log.debug("Received " + event);
         needsNewSearcher = true;
     }
+    }
 
-    protected IndexSearcher getSearcher(boolean copy) {
-        if (needsNewSearcher || searcher == null) {
+    protected synchronized IndexSearcher getSearcher(boolean copy) throws 
IOException {
+        if (copy) return  new IndexSearcher(index.getDirectoryForFullIndex() );
+        if (searcher != null && needsNewSearcher) {
             // for existing searches, leave existing searcher open for 10 
seconds, then close it (searches still not finished in 10 seconds, get an IO 
exception)
-            if (searcher != null) {
                 closingSearchers++;
                 final IndexSearcher s = searcher;
+            searcher = null;
                 timer.schedule(new TimerTask() {
                         public void run() {
                             try {
@@ -93,12 +92,9 @@
                         }
                     }, 10000);
             }
-            try {
+        if (searcher == null) {
+            searcher = new IndexSearcher(index.getDirectory());
                 needsNewSearcher = false;
-                searcher = new IndexSearcher(copy ? 
index.getDirectoryForFullIndex() : index.getDirectory());
-            } catch (IOException ioe) {
-                log.error("Can't close index searcher: " + ioe.getMessage());
-            }
             return searcher;
         } else {
             return searcher;
@@ -111,6 +107,7 @@
             try {
                 log.service("Shutting down searcher for " + index);
                 searcher.close();
+                searcher = null;
             } catch (IOException ioe) {
                 log.error("Can't close index searcher: " + ioe.getMessage());
             }
@@ -201,7 +198,8 @@
             try {
                 hits = getHits(value, filter, sort, analyzer, extraQuery, 
fields, false);
             } catch (java.io.IOException ioe) {
-                log.service(ioe + " returning empty list");
+                log.service(ioe + " returning empty list", ioe);
+                needsNewSearcher = true;
                 return org.mmbase.bridge.util.BridgeCollections.EMPTY_NODELIST;
             }
             if (log.isTraceEnabled()) {
@@ -303,9 +301,9 @@
             booleanQuery.add(extraQuery, BooleanClause.Occur.MUST);
             query = booleanQuery;
         }
-        IndexSearcher searcher = getSearcher(copy);
-        if (searcher == null) throw new IOException("No IndexSearcher found 
for " + this);
-        return searcher.search(query, filter, sort);
+        IndexSearcher s = getSearcher(copy);
+        if (s == null) throw new IOException("No IndexSearcher found for " + 
this);
+        return s.search(query, filter, sort);
     }
 
 
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to