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 fo...@apache.org on 2020/09/23 07:57:36 UTC

svn commit: r1881943 - in /jackrabbit/oak/trunk: oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ oak-search/src/test/java/or...

Author: fortino
Date: Wed Sep 23 07:57:36 2020
New Revision: 1881943

URL: http://svn.apache.org/viewvc?rev=1881943&view=rev
Log:
OAK-9219: (fix) oak-search-elastic: suggestion can return wrong results

Modified:
    jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
    jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java
    jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticRequestHandler.java
    jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticSuggestIterator.java
    jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexSuggestionCommonTest.java

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java?rev=1881943&r1=1881942&r2=1881943&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticDocument.java Wed Sep 23 07:57:36 2020
@@ -98,7 +98,11 @@ class ElasticDocument {
                     builder.field(FieldNames.FULLTEXT, fulltext);
                 }
                 if (suggest.size() > 0) {
-                    builder.startObject(FieldNames.SUGGEST).field("suggestion", suggest).endObject();
+                    builder.startArray(FieldNames.SUGGEST);
+                    for(String val: suggest) {
+                        builder.startObject().field("value", val).endObject();
+                    }
+                    builder.endArray();
                 }
                 if (notNullProps.size() > 0) {
                     builder.field(FieldNames.NOT_NULL_PROPS, notNullProps);

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java?rev=1881943&r1=1881942&r2=1881943&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java Wed Sep 23 07:57:36 2020
@@ -135,16 +135,12 @@ class ElasticIndexHelper {
                 .field("analyzer", "oak_analyzer")
                 .endObject();
         // TODO: the mapping below is for features currently not supported. These need to be reviewed
-        // when the specific features will be implemented
-//                mappingBuilder.startObject(FieldNames.SUGGEST)
-//                        .field("type", "completion")
-//                        .endObject();
-//                mappingBuilder.startObject(FieldNames.NOT_NULL_PROPS)
-//                        .field("type", "keyword")
-//                        .endObject();
-//                mappingBuilder.startObject(FieldNames.NULL_PROPS)
-//                        .field("type", "keyword")
-//                        .endObject();
+        // mappingBuilder.startObject(FieldNames.NOT_NULL_PROPS)
+        //  .field("type", "keyword")
+        //  .endObject();
+        // mappingBuilder.startObject(FieldNames.NULL_PROPS)
+        // .field("type", "keyword")
+        // .endObject();
     }
 
     private static void mapIndexRules(ElasticIndexDefinition indexDefinition, XContentBuilder mappingBuilder) throws IOException {
@@ -214,7 +210,8 @@ class ElasticIndexHelper {
                 mappingBuilder.field("type", "nested");
                 mappingBuilder.startObject("properties");
                 {
-                    mappingBuilder.startObject("suggestion")
+                    // TODO: evaluate https://www.elastic.co/guide/en/elasticsearch/reference/current/faster-prefix-queries.html
+                    mappingBuilder.startObject("value")
                             .field("type", "text")
                             .field("analyzer", "oak_analyzer")
                             .endObject();

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticRequestHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticRequestHandler.java?rev=1881943&r1=1881942&r2=1881943&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticRequestHandler.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticRequestHandler.java Wed Sep 23 07:57:36 2020
@@ -543,10 +543,9 @@ public class ElasticRequestHandler {
     }
 
     public BoolQueryBuilder suggestionMatchQuery(String suggestion) {
-        QueryBuilder qb = new MatchBoolPrefixQueryBuilder(FieldNames.SUGGEST + ".suggestion", suggestion).operator(Operator.AND);
+        QueryBuilder qb = new MatchBoolPrefixQueryBuilder(FieldNames.SUGGEST + ".value", suggestion).operator(Operator.AND);
         NestedQueryBuilder nestedQueryBuilder = nestedQuery(FieldNames.SUGGEST, qb, ScoreMode.Max);
-        InnerHitBuilder in = new InnerHitBuilder().setSize(100);
-        nestedQueryBuilder.innerHit(in);
+        nestedQueryBuilder.innerHit(new InnerHitBuilder().setSize(100));
         BoolQueryBuilder query = boolQuery()
                 .must(nestedQueryBuilder);
         nonFullTextConstraints(indexPlan, planResult).forEach(query::must);

Modified: jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticSuggestIterator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticSuggestIterator.java?rev=1881943&r1=1881942&r2=1881943&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticSuggestIterator.java (original)
+++ jackrabbit/oak/trunk/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/query/ElasticSuggestIterator.java Wed Sep 23 07:57:36 2020
@@ -17,7 +17,6 @@
 package org.apache.jackrabbit.oak.plugins.index.elastic.query;
 
 import org.apache.jackrabbit.oak.plugins.index.search.FieldNames;
-import org.apache.jackrabbit.oak.plugins.index.search.FulltextIndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.search.spi.query.FulltextIndex.FulltextResultRow;
 import org.elasticsearch.action.search.SearchRequest;
 import org.elasticsearch.action.search.SearchResponse;
@@ -25,16 +24,12 @@ import org.elasticsearch.client.RequestO
 import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
-import org.elasticsearch.search.sort.SortBuilders;
-import org.elasticsearch.search.sort.SortOrder;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.List;
 import java.util.PriorityQueue;
 
 /**
@@ -94,7 +89,7 @@ class ElasticSuggestIterator implements
         for (SearchHit doc : res.getHits()) {
             if (responseHandler.isAccessible(responseHandler.getPath(doc))) {
                 for (SearchHit suggestion : doc.getInnerHits().get(FieldNames.SUGGEST).getHits()) {
-                    suggestionPriorityQueue.add(new ElasticSuggestion(((List<String>) suggestion.getSourceAsMap().get("suggestion")).get(0), suggestion.getScore()));
+                    suggestionPriorityQueue.add(new ElasticSuggestion((String) suggestion.getSourceAsMap().get("value"), suggestion.getScore()));
                 }
             }
         }

Modified: jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexSuggestionCommonTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexSuggestionCommonTest.java?rev=1881943&r1=1881942&r2=1881943&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexSuggestionCommonTest.java (original)
+++ jackrabbit/oak/trunk/oak-search/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexSuggestionCommonTest.java Wed Sep 23 07:57:36 2020
@@ -387,16 +387,28 @@ public abstract class IndexSuggestionCom
 
         Node indexedNode = root.addNode("indexedNode", nodeType);
         indexedNode.setProperty(suggestProp1, "car there");
+        indexedNode.setProperty(suggestProp2, "bike there");
         indexedNode = root.addNode("indexedNode2", nodeType);
+        indexedNode.setProperty(suggestProp1, "bike here");
         indexedNode.setProperty(suggestProp2, "car here");
 
         session.save();
 
-        String suggQuery = createSuggestQuery(nodeType, "car");
         QueryManager queryManager = session.getWorkspace().getQueryManager();
         assertEventually(() -> {
             try {
-                assertEquals("There should be some suggestion",2, getAllResults(queryManager, suggQuery).size());
+                List<String> results = getAllResults(queryManager, createSuggestQuery(nodeType, "car"));
+                assertEquals("There should be some suggestion",2, results.size());
+                assertTrue(results.stream().allMatch(r -> r.startsWith("car")));
+            } catch (RepositoryException e) {
+                throw new RuntimeException(e);
+            }
+        });
+        assertEventually(() -> {
+            try {
+                List<String> results = getAllResults(queryManager, createSuggestQuery(nodeType, "bike"));
+                assertEquals("There should be some suggestion",2, results.size());
+                assertTrue(results.stream().allMatch(r -> r.startsWith("bike")));
             } catch (RepositoryException e) {
                 throw new RuntimeException(e);
             }