This is an automated email from the ASF dual-hosted git repository.

fortino pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 8384d9495b OAK-12045: strip leading and trailing whitespaces 
(including newlines) from :fulltext (#2670)
8384d9495b is described below

commit 8384d9495bd8efd82634f6f0c8e8b896706f3468
Author: Fabrizio Fortino <[email protected]>
AuthorDate: Mon Jan 5 16:46:21 2026 +0100

    OAK-12045: strip leading and trailing whitespaces (including newlines) from 
:fulltext (#2670)
---
 .../index/elastic/index/ElasticDocument.java       |  7 +++-
 .../plugins/index/elastic/ElasticContentTest.java  | 43 ++++++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)

diff --git 
a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
 
b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
index 783e6f2865..e6012c6d88 100644
--- 
a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
+++ 
b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
@@ -90,7 +90,12 @@ public class ElasticDocument {
     }
 
     void addFulltext(String value) {
-        fulltext.add(value);
+        if (value != null) {
+            String cleaned = value.strip();
+            if (!cleaned.isEmpty()) {
+                fulltext.add(cleaned);
+            }
+        }
     }
 
     void addFulltextRelative(String path, String value) {
diff --git 
a/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticContentTest.java
 
b/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticContentTest.java
index a2440cad33..4aa959f5c8 100644
--- 
a/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticContentTest.java
+++ 
b/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/ElasticContentTest.java
@@ -16,10 +16,12 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.elastic;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.elastic.util.ElasticIndexUtils;
+import org.apache.jackrabbit.oak.plugins.index.search.FieldNames;
 import 
org.apache.jackrabbit.oak.plugins.index.search.util.IndexDefinitionBuilder;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 import org.junit.Ignore;
@@ -32,6 +34,7 @@ import java.util.UUID;
 import java.util.function.BiConsumer;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
+import java.util.stream.StreamSupport;
 
 import static 
org.apache.jackrabbit.oak.plugins.index.elastic.ElasticTestUtils.randomString;
 import static org.hamcrest.CoreMatchers.endsWith;
@@ -39,6 +42,7 @@ import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.hasItem;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.AdditionalMatchers.geq;
 import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -329,4 +333,43 @@ public class ElasticContentTest extends 
ElasticAbstractQueryTest {
             assertThat(indexAlias, not(endsWith("_v" + 
ElasticIndexDefinition.MAPPING_VERSION)));
         }
     }
+
+    @Test
+    public void fulltextFieldValuesCleanup() throws Exception {
+        IndexDefinitionBuilder builder = createIndex("a").noAsync();
+        builder.includedPaths("/content");
+        builder.indexRule("nt:base").property("a").nodeScopeIndex();
+        Tree index = setIndex(UUID.randomUUID().toString(), builder);
+        root.commit();
+
+        Tree content = root.getTree("/").addChild("content");
+        content.addChild("indexed1").setProperty("a", "foo bar baz");
+        content.addChild("indexed2").setProperty("a", "\nfoo foo baz\n");
+        content.addChild("indexed3").setProperty("a", "\n\n\n  foo foo baz  
\n\n\n");
+        root.commit();
+
+        assertEventually(() -> {
+            ObjectNode indexed1 = getDocument(index, "/content/indexed1");
+            List<String> values1 = StreamSupport.stream(
+                    
indexed1.get(ElasticIndexUtils.fieldName(FieldNames.FULLTEXT)).spliterator(), 
false)
+                    .map(JsonNode::asText)
+                    .collect(Collectors.toList());
+            assertThat(values1, hasItem("foo bar baz"));
+
+            ObjectNode indexed2 = getDocument(index, "/content/indexed2");
+            List<String> values2 = StreamSupport.stream(
+                    
indexed2.get(ElasticIndexUtils.fieldName(FieldNames.FULLTEXT)).spliterator(), 
false)
+                    .map(JsonNode::asText)
+                    .collect(Collectors.toList());
+            assertThat(values2, hasItem("foo foo baz"));
+
+            ObjectNode indexed3 = getDocument(index, "/content/indexed3");
+            List<String> values3 = StreamSupport.stream(
+                    
indexed3.get(ElasticIndexUtils.fieldName(FieldNames.FULLTEXT)).spliterator(), 
false)
+                    .map(JsonNode::asText)
+                    .collect(Collectors.toList());
+            assertThat(values3, hasItem("foo foo baz"));
+        });
+    }
+
 }

Reply via email to