pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / contrib / facet / src / examples / org / apache / lucene / facet / example / association / AssociationIndexer.java
diff --git a/lucene-java-3.5.0/lucene/contrib/facet/src/examples/org/apache/lucene/facet/example/association/AssociationIndexer.java b/lucene-java-3.5.0/lucene/contrib/facet/src/examples/org/apache/lucene/facet/example/association/AssociationIndexer.java
new file mode 100644 (file)
index 0000000..17e30b6
--- /dev/null
@@ -0,0 +1,132 @@
+package org.apache.lucene.facet.example.association;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.Field.Index;
+import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
+import org.apache.lucene.store.Directory;
+
+import org.apache.lucene.facet.enhancements.EnhancementsDocumentBuilder;
+import org.apache.lucene.facet.enhancements.association.AssociationProperty;
+import org.apache.lucene.facet.example.ExampleUtils;
+import org.apache.lucene.facet.example.simple.SimpleUtils;
+import org.apache.lucene.facet.index.CategoryContainer;
+import org.apache.lucene.facet.index.CategoryDocumentBuilder;
+import org.apache.lucene.facet.taxonomy.CategoryPath;
+import org.apache.lucene.facet.taxonomy.TaxonomyWriter;
+import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyWriter;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Sample indexer creates an index, and adds to it sample documents with
+ * categories, which can be simple or contain associations.
+ * 
+ * @lucene.experimental
+ */
+public class AssociationIndexer {
+
+  /**
+   * Create an index, and adds to it sample documents and categories.
+   * 
+   * @param indexDir
+   *            Directory in which the index should be created.
+   * @param taxoDir
+   *            Directory in which the taxonomy index should be created.
+   * @throws Exception
+   *             on error (no detailed exception handling here for sample
+   *             simplicity
+   */
+  public static void index(Directory indexDir, Directory taxoDir) throws Exception {
+
+    // create and open an index writer
+    IndexWriter iw = new IndexWriter(indexDir, new IndexWriterConfig(ExampleUtils.EXAMPLE_VER, SimpleUtils.analyzer));
+
+    // create and open a taxonomy writer
+    TaxonomyWriter taxo = new DirectoryTaxonomyWriter(taxoDir, OpenMode.CREATE);
+
+    // loop over sample documents
+    int nDocsAdded = 0;
+    int nFacetsAdded = 0;
+    for (int docNum = 0; docNum < SimpleUtils.docTexts.length; docNum++) {
+      ExampleUtils.log(" ++++ DOC ID: " + docNum);
+      // obtain the sample categories for current document
+      CategoryContainer categoryContainer = new CategoryContainer();
+      for (CategoryPath path : SimpleUtils.categories[docNum]) {
+        categoryContainer.addCategory(path);
+        ExampleUtils.log("\t ++++ PATH: " + path);
+      }
+      // and also those with associations
+      CategoryPath[] associationsPaths = AssociationUtils.categories[docNum];
+      AssociationProperty[] associationProps = AssociationUtils.associations[docNum];
+      for (int i = 0; i < associationsPaths.length; i++) {
+        categoryContainer.addCategory(associationsPaths[i], associationProps[i]);
+        ExampleUtils.log("\t $$$$ Association: ("
+            + associationsPaths[i] + "," + associationProps[i]
+            + ")");
+      }
+
+      // we do not alter indexing parameters!
+      // a category document builder will add the categories to a document
+      // once build() is called
+      CategoryDocumentBuilder categoryDocBuilder = new EnhancementsDocumentBuilder(
+          taxo, AssociationUtils.assocIndexingParams);
+      categoryDocBuilder.setCategories(categoryContainer);
+
+      // create a plain Lucene document and add some regular Lucene fields
+      // to it
+      Document doc = new Document();
+      doc.add(new Field(SimpleUtils.TITLE, SimpleUtils.docTitles[docNum],
+          Store.YES, Index.ANALYZED));
+      doc.add(new Field(SimpleUtils.TEXT, SimpleUtils.docTexts[docNum],
+          Store.NO, Index.ANALYZED));
+
+      // invoke the category document builder for adding categories to the
+      // document and,
+      // as required, to the taxonomy index
+      categoryDocBuilder.build(doc);
+
+      // finally add the document to the index
+      iw.addDocument(doc);
+
+      nDocsAdded++;
+      nFacetsAdded += categoryContainer.size();
+    }
+
+    // commit changes.
+    // we commit changes to the taxonomy index prior to committing them to
+    // the search index.
+    // this is important, so that all facets referred to by documents in the
+    // search index
+    // will indeed exist in the taxonomy index.
+    taxo.commit();
+    iw.commit();
+
+    // close the taxonomy index and the index - all modifications are
+    // now safely in the provided directories: indexDir and taxoDir.
+    taxo.close();
+    iw.close();
+
+    ExampleUtils.log("Indexed " + nDocsAdded + " documents with overall "
+        + nFacetsAdded + " facets.");
+  }
+  
+}