Skip to content

Commit

Permalink
fix ATOM sort and searchAfter (#732)
Browse files Browse the repository at this point in the history
  • Loading branch information
taoyyu authored Sep 27, 2024
1 parent 6dd6085 commit bef28b4
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.apache.lucene.index.IndexOptions;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.SortedSetSortField;
import org.apache.lucene.util.BytesRef;

/** Field class for 'ATOM' field type. Uses {@link KeywordAnalyzer} for text analysis. */
public class AtomFieldDef extends TextBaseFieldDef implements Sortable {
Expand All @@ -50,7 +51,7 @@ public String getType() {

@Override
public Object parseLastValue(String value) {
return value;
return new BytesRef(value);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopFieldCollector;
import org.apache.lucene.search.TopFieldDocs;
import org.apache.lucene.util.BytesRef;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -89,8 +90,14 @@ public void fillLastHit(SearchResponse.SearchState.Builder stateBuilder, ScoreDo
LastHitInfo.Builder lastHitBuilder = LastHitInfo.newBuilder();
lastHitBuilder.setLastDocId(lastHit.doc);
for (Object fv : fd.fields) {
stateBuilder.addLastFieldValues(fv.toString());
lastHitBuilder.addLastFieldValues(fv.toString());
String fvstr;
if (fv instanceof BytesRef) {
fvstr = ((BytesRef) fv).utf8ToString();
} else {
fvstr = fv.toString();
}
stateBuilder.addLastFieldValues(fvstr);
lastHitBuilder.addLastFieldValues(fvstr);
}
stateBuilder.setLastHitInfo(lastHitBuilder.build());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.apache.lucene.search.FieldDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.util.BytesRef;

/**
* Class to handle creation of a {@link Sort} used to sort documents by field values for queries.
Expand Down Expand Up @@ -195,7 +196,11 @@ private static SearchResponse.Hit.CompositeFieldValue getValueForSortField(
break;
case STRING:
case STRING_VAL:
fieldValue.setTextValue((String) sortValue);
if (sortValue instanceof BytesRef) {
fieldValue.setTextValue(((BytesRef) sortValue).utf8ToString());
} else {
fieldValue.setTextValue((String) sortValue);
}
break;
case CUSTOM:
// could be anything, try to determine from value class
Expand Down
61 changes: 61 additions & 0 deletions src/test/java/com/yelp/nrtsearch/server/grpc/SortFieldTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,38 @@ public void testReverseSortQueryVirtualField() {
}
}

@Test
public void testSortAtomDocId() {
QuerySortField querySortField =
QuerySortField.newBuilder()
.setFields(
SortFields.newBuilder()
.addSortedFields(SortType.newBuilder().setFieldName("doc_id").build())
.build())
.build();
SearchResponse searchResponse = doSortQuery(querySortField);
assertEquals(5, searchResponse.getHitsCount());
List<String> expectedIds = Arrays.asList("0", "1", "10", "11", "12");
assertFields(expectedIds, searchResponse.getHitsList());
}

@Test
public void testSortAtomDocIdSearchAfter() {
QuerySortField querySortField =
QuerySortField.newBuilder()
.setFields(
SortFields.newBuilder()
.addSortedFields(SortType.newBuilder().setFieldName("doc_id").build())
.build())
.build();
LastHitInfo searchAfter = LastHitInfo.newBuilder().addLastFieldValues("1").build();
SearchResponse searchResponse = dosSortQuerySearchAfter(querySortField, searchAfter);
assertEquals(5, searchResponse.getHitsCount());

List<String> expectedIds = Arrays.asList("1", "10", "11", "12", "13");
assertFields(expectedIds, searchResponse.getHitsList());
}

@Test
public void testSortDocId() {
QuerySortField querySortField =
Expand Down Expand Up @@ -783,6 +815,35 @@ public void testSortLanLonDistanceInInnerHit() {
}
}

@Test
public void testSortIntFieldWithSearchAfter() {
QuerySortField querySortField =
QuerySortField.newBuilder()
.setFields(
SortFields.newBuilder()
.addSortedFields(SortType.newBuilder().setFieldName("int_field").build())
.build())
.build();
LastHitInfo searchAfter = LastHitInfo.newBuilder().addLastFieldValues("1").build();
SearchResponse searchResponse = dosSortQuerySearchAfter(querySortField, searchAfter);
assertEquals(5, searchResponse.getHitsCount());

List<String> expectedIds = Arrays.asList("91", "92", "93", "94", "95");
assertFields(expectedIds, searchResponse.getHitsList());

List<Integer> expectedSort = Arrays.asList(1, 2, 3, 4, 5);
for (int i = 0; i < searchResponse.getHitsCount(); ++i) {
var hit = searchResponse.getHits(i);
assertEquals(1, hit.getSortedFieldsCount());
assertEquals(
expectedSort.get(i).intValue(),
hit.getSortedFieldsOrThrow("int_field").getFieldValue(0).getIntValue());

assertEquals(0.0, hit.getScore(), 0);
assertEquals(6, hit.getFieldsCount());
}
}

@Test
public void testSortDocIdWithSearchAfter() {
QuerySortField querySortField =
Expand Down

0 comments on commit bef28b4

Please sign in to comment.