Author: amrverma
Date: Wed Nov 25 08:39:17 2020
New Revision: 1883816

URL: http://svn.apache.org/viewvc?rev=1883816&view=rev
Log:
OAK-9281: NRT Index - duplicate results with similarity search
(patch provided by Tom Blackford)

Modified:
    
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/HybridIndexTest.java
    
jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java

Modified: 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/HybridIndexTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/HybridIndexTest.java?rev=1883816&r1=1883815&r2=1883816&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/HybridIndexTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/HybridIndexTest.java
 Wed Nov 25 08:39:17 2020
@@ -26,6 +26,7 @@ import java.io.InputStream;
 import java.lang.management.ManagementFactory;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -216,6 +217,32 @@ public class HybridIndexTest extends Abs
     }
 
     @Test
+    public void testSimilarityQuery() throws Exception {
+        String idxName = "hybridtest";
+        Tree idx = createFulltextIndex(root.getTree("/"), idxName);
+        TestUtil.enableIndexingMode(idx, 
FulltextIndexConstants.IndexingMode.NRT);
+        root.commit();
+        String query = "select [jcr:path] from [nt:base] where similar(., 
'/test/a')";
+
+        //Get initial indexing done as local indexing only work
+        //for incremental indexing
+        Tree test = root.getTree("/").addChild("test");
+        test.addChild("a").setProperty("text", "Hello World Hello World");
+        root.commit();
+        runAsyncIndex();
+        test = root.getTree("/").addChild("test");
+        test.addChild("b").setProperty("text", "Hello World");
+        test.addChild("c").setProperty("text", "World");
+        test.addChild("d").setProperty("text", "Hello");
+        root.commit();
+
+        //Now let some time elapse such that readers can be refreshed
+        clock.waitUntil(clock.getTime() + refreshDelta + 1);
+        List<String> result = executeQuery(query, "JCR-SQL2");
+        assertEquals(4, result.size());
+    }
+
+    @Test
     public void noTextExtractionForSyncCommit() throws Exception{
         String idxName = "hybridtest";
         Tree idx = createFulltextIndex(root.getTree("/"), idxName);

Modified: 
jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java?rev=1883816&r1=1883815&r2=1883816&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/query/FulltextIndexPlanner.java
 Wed Nov 25 08:39:17 2020
@@ -412,29 +412,26 @@ public class FulltextIndexPlanner {
 
     private IndexPlan.Builder getNativeFunctionPlanBuilder(String 
indexingRuleBaseNodeType) {
         boolean canHandleNativeFunction = true;
-
         PropertyValue pv = 
filter.getPropertyRestriction(definition.getFunctionName()).first;
         String query = pv.getValue(Type.STRING);
-
+        // Suggestion and SpellCheck use virtual paths which are same for all 
results
+        // so we must disable later filtering of unique paths
         if (query.startsWith("suggest?term=")) {
             if (definition.isSuggestEnabled()) {
                 canHandleNativeFunction = 
indexingRuleBaseNodeType.equals(filter.getNodeType());
+                result.disableUniquePaths();
             } else {
                 canHandleNativeFunction = false;
             }
         } else if (query.startsWith("spellcheck?term=")) {
             if (definition.isSpellcheckEnabled()) {
                 canHandleNativeFunction = 
indexingRuleBaseNodeType.equals(filter.getNodeType());
+                result.disableUniquePaths();
             } else {
                 canHandleNativeFunction = false;
             }
         }
-
-        //Suggestion and SpellCheck use virtual paths which is same for all 
results
-        if (canHandleNativeFunction) {
-            result.disableUniquePaths();
-        }
-
+        
         if (!canHandleNativeFunction) {
             return null;
         }


Reply via email to