Add matched_queries field to SearchHit.

Original Pull Request #1722 
Closes #1514
This commit is contained in:
Matt Gilene 2021-03-11 12:32:37 -05:00 committed by GitHub
parent 3f39f5d5b7
commit 4dc8b2589a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 62 additions and 10 deletions

View File

@ -33,6 +33,7 @@ import org.springframework.util.Assert;
*
* @param <T> the result data class.
* @author Peter-Josef Meisch
* @author Matt Gilene
* @since 4.0
*/
public class SearchHit<T> {
@ -47,16 +48,18 @@ public class SearchHit<T> {
@Nullable private final NestedMetaData nestedMetaData;
@Nullable private final String routing;
@Nullable private final Explanation explanation;
@Nullable private final List<String> matchedQueries;
public SearchHit(@Nullable String index, @Nullable String id, @Nullable String routing, float score,
@Nullable Object[] sortValues, @Nullable Map<String, List<String>> highlightFields, T content) {
this(index, id, routing, score, sortValues, highlightFields, null, null, null, content);
this(index, id, routing, score, sortValues, highlightFields, null, null, null, null, content);
}
public SearchHit(@Nullable String index, @Nullable String id, @Nullable String routing, float score,
@Nullable Object[] sortValues, @Nullable Map<String, List<String>> highlightFields,
@Nullable Map<String, SearchHits<?>> innerHits, @Nullable NestedMetaData nestedMetaData,
@Nullable Explanation explanation, T content) {
@Nullable Explanation explanation,
@Nullable List<String> matchedQueries, T content) {
this.index = index;
this.id = id;
this.routing = routing;
@ -74,6 +77,7 @@ public class SearchHit<T> {
this.nestedMetaData = nestedMetaData;
this.explanation = explanation;
this.content = content;
this.matchedQueries = matchedQueries;
}
/**
@ -188,4 +192,12 @@ public class SearchHit<T> {
public Explanation getExplanation() {
return explanation;
}
/**
* @return the matched queries for this SearchHit.
*/
@Nullable
public List<String> getMatchedQueries() {
return matchedQueries;
}
}

View File

@ -43,6 +43,7 @@ import org.springframework.util.Assert;
* @author Peter-Josef Meisch
* @author Mark Paluch
* @author Roman Puchkovskiy
* @author Matt Gilene
* @since 4.0
*/
class SearchHitMapping<T> {
@ -114,6 +115,7 @@ class SearchHitMapping<T> {
mapInnerHits(searchDocument), //
searchDocument.getNestedMetaData(), //
searchDocument.getExplanation(), //
searchDocument.getMatchedQueries(), //
content); //
}
@ -198,6 +200,7 @@ class SearchHitMapping<T> {
searchHit.getInnerHits(), //
persistentEntityWithNestedMetaData.nestedMetaData, //
searchHit.getExplanation(), //
searchHit.getMatchedQueries(), //
targetObject));
});

View File

@ -31,6 +31,10 @@ import java.util.Set;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
@ -47,10 +51,6 @@ import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
/**
* Utility class to adapt {@link org.elasticsearch.action.get.GetResponse},
* {@link org.elasticsearch.index.get.GetResult}, {@link org.elasticsearch.action.get.MultiGetResponse}
@ -60,6 +60,7 @@ import com.fasterxml.jackson.core.JsonGenerator;
* @author Mark Paluch
* @author Peter-Josef Meisch
* @author Roman Puchkovskiy
* @author Matt Gilene
* @since 4.0
*/
public class DocumentAdapters {
@ -181,6 +182,7 @@ public class DocumentAdapters {
NestedMetaData nestedMetaData = from(source.getNestedIdentity());
Explanation explanation = from(source.getExplanation());
List<String> matchedQueries = from(source.getMatchedQueries());
BytesReference sourceRef = source.getSourceRef();
@ -188,7 +190,7 @@ public class DocumentAdapters {
return new SearchDocumentAdapter(
source.getScore(), source.getSortValues(), source.getFields(), highlightFields, fromDocumentFields(source,
source.getIndex(), source.getId(), source.getVersion(), source.getSeqNo(), source.getPrimaryTerm()),
innerHits, nestedMetaData, explanation);
innerHits, nestedMetaData, explanation, matchedQueries);
}
Document document = Document.from(source.getSourceAsMap());
@ -202,7 +204,7 @@ public class DocumentAdapters {
document.setPrimaryTerm(source.getPrimaryTerm());
return new SearchDocumentAdapter(source.getScore(), source.getSortValues(), source.getFields(), highlightFields,
document, innerHits, nestedMetaData, explanation);
document, innerHits, nestedMetaData, explanation, matchedQueries);
}
@Nullable
@ -231,6 +233,11 @@ public class DocumentAdapters {
return NestedMetaData.of(nestedIdentity.getField().string(), nestedIdentity.getOffset(), child);
}
@Nullable
private static List<String> from(@Nullable String[] matchedQueries) {
return matchedQueries == null ? null : Arrays.asList(matchedQueries);
}
/**
* Create an unmodifiable {@link Document} from {@link Iterable} of {@link DocumentField}s.
*
@ -484,10 +491,11 @@ public class DocumentAdapters {
private final Map<String, SearchDocumentResponse> innerHits = new HashMap<>();
@Nullable private final NestedMetaData nestedMetaData;
@Nullable private final Explanation explanation;
@Nullable private final List<String> matchedQueries;
SearchDocumentAdapter(float score, Object[] sortValues, Map<String, DocumentField> fields,
Map<String, List<String>> highlightFields, Document delegate, Map<String, SearchDocumentResponse> innerHits,
@Nullable NestedMetaData nestedMetaData, @Nullable Explanation explanation) {
@Nullable NestedMetaData nestedMetaData, @Nullable Explanation explanation, @Nullable List<String> matchedQueries) {
this.score = score;
this.sortValues = sortValues;
@ -497,6 +505,7 @@ public class DocumentAdapters {
this.innerHits.putAll(innerHits);
this.nestedMetaData = nestedMetaData;
this.explanation = explanation;
this.matchedQueries = matchedQueries;
}
@Override
@ -679,6 +688,12 @@ public class DocumentAdapters {
return explanation;
}
@Override
@Nullable
public List<String> getMatchedQueries() {
return matchedQueries;
}
@Override
public boolean equals(Object o) {
if (this == o) {

View File

@ -25,6 +25,7 @@ import org.springframework.lang.Nullable;
*
* @author Mark Paluch
* @author Peter-Josef Meisch
* @author Matt Gilene
* @since 4.0
* @see Document
*/
@ -105,4 +106,10 @@ public interface SearchDocument extends Document {
*/
@Nullable
Explanation getExplanation();
/**
* @return the matched queries for the SearchHit.
*/
@Nullable
List<String> getMatchedQueries();
}

View File

@ -15,7 +15,7 @@
*/
package org.springframework.data.elasticsearch.core;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.IOException;
import java.util.Arrays;
@ -45,6 +45,7 @@ import org.springframework.data.elasticsearch.core.document.SearchDocument;
* @author Mark Paluch
* @author Peter-Josef Meisch
* @author Roman Puchkovskiy
* @author Matt Gilene
*/
public class DocumentAdaptersUnitTests {
@ -262,4 +263,18 @@ public class DocumentAdaptersUnitTests {
List<Explanation> details = explanation.getDetails();
assertThat(details).containsExactly(new Explanation(false, 0.0, "explanation noMatch", Collections.emptyList()));
}
@Test // DATAES-979
@DisplayName("should adapt returned matched queries")
void shouldAdaptReturnedMatchedQueries() {
SearchHit searchHit = new SearchHit(42);
searchHit.matchedQueries(new String[] { "query1", "query2" });
SearchDocument searchDocument = DocumentAdapters.from(searchHit);
List<String> matchedQueries = searchDocument.getMatchedQueries();
assertThat(matchedQueries).isNotNull();
assertThat(matchedQueries).hasSize(2);
assertThat(matchedQueries).isEqualTo(Arrays.asList("query1", "query2"));
}
}