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);
}