You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by to...@apache.org on 2014/11/03 13:32:27 UTC

svn commit: r1636336 - in /jackrabbit/oak/trunk/oak-lucene/src: main/java/org/apache/jackrabbit/oak/plugins/index/lucene/ main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/ test/java/org/apache/jackrabbit/oak/plugins/index/lucene/

Author: tommaso
Date: Mon Nov  3 12:32:26 2014
New Revision: 1636336

URL: http://svn.apache.org/r1636336
Log:
OAK-2178 - applied patch from Rishabh Maurya for lucene field boost at index time

Modified:
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
    jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/MoreLikeThisHelper.java
    jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java?rev=1636336&r1=1636335&r2=1636336&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexConstants.java Mon Nov  3 12:32:26 2014
@@ -100,4 +100,10 @@ public interface LuceneIndexConstants {
      * Child node name under which property details are provided
      */
     String PROP_NODE = "properties";
+
+    /**
+     * Field boost factor
+     */
+    String FIELD_BOOST = "boost";
+
 }

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java?rev=1636336&r1=1636335&r2=1636336&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexEditor.java Mon Nov  3 12:32:26 2014
@@ -338,7 +338,13 @@ public class LuceneIndexEditor implement
                         !context.skipTokenization(pname),
                         context.isStored(pname)));
                 if (context.isFullTextEnabled()) {
-                    fields.add(newFulltextField(value));
+                    Field field = newFulltextField(value);
+                    boolean hasBoost = context.getDefinition().getPropDefn(pname) != null &&
+                            context.getDefinition().getPropDefn(pname).hasFieldBoost();
+                    if (hasBoost) {
+                        field.setBoost((float)context.getDefinition().getPropDefn(pname).fieldBoost());
+                    }
+                    fields.add(field);
                 }
                 dirty = true;
             }

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java?rev=1636336&r1=1636335&r2=1636336&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/PropertyDefinition.java Mon Nov  3 12:32:26 2014
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.plugin
 
 import javax.jcr.PropertyType;
 
+import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,6 +32,8 @@ class PropertyDefinition {
     private final NodeBuilder definition;
 
     private final int propertyType;
+    private double fieldBoost;
+    private boolean hasFieldBoost;
 
     public PropertyDefinition(IndexDefinition idxDefn, String name, NodeBuilder defn) {
         this.name = name;
@@ -46,9 +49,20 @@ class PropertyDefinition {
             }
         }
         this.propertyType = type;
+        this.hasFieldBoost = defn.hasProperty(LuceneIndexConstants.FIELD_BOOST) && (defn.getProperty(LuceneIndexConstants.FIELD_BOOST).getType().tag() == Type.DOUBLE.tag());
+        // if !hasFieldBoost then setting default lucene field boost = 1.0
+        fieldBoost = hasFieldBoost ? defn.getProperty(LuceneIndexConstants.FIELD_BOOST).getValue(Type.DOUBLE) : 1.0;
     }
 
     public int getPropertyType() {
         return propertyType;
     }
+
+    public boolean hasFieldBoost() {
+        return hasFieldBoost;
+    }
+
+    public double fieldBoost() {
+        return fieldBoost;
+    }
 }

Modified: jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/MoreLikeThisHelper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/MoreLikeThisHelper.java?rev=1636336&r1=1636335&r2=1636336&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/MoreLikeThisHelper.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/MoreLikeThisHelper.java Mon Nov  3 12:32:26 2014
@@ -94,7 +94,7 @@ public class MoreLikeThisHelper {
                                 fieldNames.add(f.name());
                             }
                         }
-                        String[] docFields = fieldNames.toArray(new String[0]);
+                        String[] docFields = fieldNames.toArray(new String[fieldNames.size()]);
                         mlt.setFieldNames(docFields);
                         moreLikeThisQuery = mlt.like(d.doc);
                     }

Modified: jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java?rev=1636336&r1=1636335&r2=1636336&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java (original)
+++ jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java Mon Nov  3 12:32:26 2014
@@ -667,8 +667,49 @@ public class LucenePropertyIndexTest ext
         assertOrderedQuery("select [jcr:path] from [nt:base] where [bar] = 'baz' order by [foo] asc, [baz] desc", getSortedPaths(tuples));
     }
 
+    @Test
+    public void indexTimeFieldBoost() throws Exception {
+
+        // Index Definition
+        Tree idx = createIndex("test1", of("propa", "propb", "propc"));
+        idx.setProperty(LuceneIndexConstants.FULL_TEXT_ENABLED, true);
+        Tree propNode = idx.addChild(PROP_NODE);
+        root.commit();
+
+        // property definition for index test1
+        Tree propA = propNode.addChild("propa");
+        propA.setProperty(LuceneIndexConstants.PROP_TYPE, PropertyType.TYPENAME_STRING);
+        propA.setProperty(LuceneIndexConstants.FIELD_BOOST, 2.0);
+
+        Tree propB = propNode.addChild("propb");
+        propB.setProperty(LuceneIndexConstants.PROP_TYPE, PropertyType.TYPENAME_STRING);
+        propB.setProperty(LuceneIndexConstants.FIELD_BOOST, 1.0);
+
+        Tree propC = propNode.addChild("propc");
+        propC.setProperty(LuceneIndexConstants.PROP_TYPE, PropertyType.TYPENAME_STRING);
+        propC.setProperty(LuceneIndexConstants.FIELD_BOOST, 4.0);
+        root.commit();
+
+        // create test data
+        Tree test = root.getTree("/").addChild("test");
+        root.commit();
+        test.addChild("a").setProperty("propa", "foo");
+        test.addChild("b").setProperty("propb", "foo");
+        test.addChild("c").setProperty("propc", "foo");
+        root.commit();
+
+        String queryString = "//* [jcr:contains(., 'foo' )]";
+        // verify results ordering
+        // which should be /test/c (boost = 4.0), /test/a(boost = 2.0), /test/b (1.0)
+        assertOrderedQuery(queryString, asList("/test/c", "/test/a", "/test/b"), XPATH, true);
+    }
+
     private void assertOrderedQuery(String sql, List<String> paths) {
-        List<String> result = executeQuery(sql, SQL2, true);
+        assertOrderedQuery(sql, paths, SQL2, false);
+    }
+
+    private void assertOrderedQuery(String sql, List<String> paths, String language, boolean skipSort) {
+        List<String> result = executeQuery(sql, language, true, skipSort);
         assertEquals(paths, result);
     }