发布时间:2025-12-09 12:03:32 浏览次数:1
import com.google.appengine.api.search.SortExpression; //导入依赖的package包/类protected SortOptions.Builder buildSortOptions(List<OrderComponent> order) { SortOptions.Builder sortOptions = SortOptions.newBuilder(); for (OrderComponent sort : order) { String fieldName = getEncodedFieldName(sort.getField()); SortExpression.Builder expression = SortExpression.newBuilder().setExpression(fieldName); expression = expression.setDirection(sort.isAscending() ? SortExpression.SortDirection.ASCENDING : SortExpression.SortDirection.DESCENDING); IndexType indexType = metadata.getIndexType(sort.getField()); if (IndexType.SmallDecimal == indexType || IndexType.BigDecimal == indexType) { expression = expression.setDefaultValueNumeric(sort.isDescending() ? IntLow : IntHigh); } else if (IndexType.Date == indexType) { expression = expression.setDefaultValueDate(sort.isDescending() ? DateLow : DateHigh); } else { expression = expression.setDefaultValue(sort.isDescending() ? StringLow : StringHigh); } sortOptions = sortOptions.addSortExpression(expression); } return sortOptions;} import com.google.appengine.api.search.SortExpression; //导入依赖的package包/类@Overridepublic SortOptions apply(Query<?> query) { SortOptions.Builder sortOptions = SortOptions.newBuilder(); query.getSort().ifPresent(sort -> { for (Order order : sort) { SearchFieldMetadata searchFieldMetadata = searchMetadata.getField(query.getResultType(), order.getProperty()); SortExpression.Builder expression = SortExpression.newBuilder() .setExpression(searchFieldMetadata.getEncodedName()) .setDirection(order.getDirection().isAscending() ? ASCENDING : DESCENDING); applyDefaultValue(order, searchFieldMetadata.getIndexType(), expression); sortOptions.addSortExpression(expression.build()); } }); return sortOptions.build();} import com.google.appengine.api.search.SortExpression; //导入依赖的package包/类private void applyDefaultValue(Order order, IndexType indexType, SortExpression.Builder expression) { if (indexType == NUMBER) { expression.setDefaultValueNumeric(order.isAscending() ? MAXIMUM_NUMBER_VALUE : MINIMUM_NUMBER_VALUE); } else if (indexType == DATE) { expression.setDefaultValueDate(order.isAscending() ? MAXIMUM_DATE_VALUE : MINIMUM_DATE_VALUE); } else { expression.setDefaultValue(order.isAscending() ? HIGH_STRING_CHAR : ""); }} import com.google.appengine.api.search.SortExpression; //导入依赖的package包/类private Results<ScoredDocument> doSearch() { String indexName = SEARCH_INDEX; // [START search_with_options] try { // Build the SortOptions with 2 sort keys SortOptions sortOptions = SortOptions.newBuilder() .addSortExpression(SortExpression.newBuilder() .setExpression("price") .setDirection(SortExpression.SortDirection.DESCENDING) .setDefaultValueNumeric(0)) .addSortExpression(SortExpression.newBuilder() .setExpression("brand") .setDirection(SortExpression.SortDirection.DESCENDING) .setDefaultValue("")) .setLimit(1000) .build(); // Build the QueryOptions QueryOptions options = QueryOptions.newBuilder() .setLimit(25) .setFieldsToReturn("model", "price", "description") .setSortOptions(sortOptions) .build(); // A query string String queryString = "product: coffee roaster AND price < 500"; // Build the Query and run the search Query query = Query.newBuilder().setOptions(options).build(queryString); IndexSpec indexSpec = IndexSpec.newBuilder().setName(indexName).build(); Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec); Results<ScoredDocument> result = index.search(query); return result; } catch (SearchException e) { // handle exception... } // [END search_with_options] return null;} import com.google.appengine.api.search.SortExpression; //导入依赖的package包/类@Testpublic void testSortOptions() { for (SortExpression.SortDirection direction : SortExpression.SortDirection.values()) { SortExpression sortExpression = SortExpression.newBuilder() .setExpression("numfield") .setDirection(direction) .setDefaultValueNumeric(9999) .build(); SortOptions sortOptions = SortOptions.newBuilder() .addSortExpression(sortExpression) .build(); QueryOptions options = QueryOptions.newBuilder() .setFieldsToReturn("numfield", "datefield") .setSortOptions(sortOptions) .build(); Query.Builder queryBuilder = Query.newBuilder().setOptions(options); Results<ScoredDocument> results = index.search(queryBuilder.build("")); double pre = -9999; if (direction.equals(SortExpression.SortDirection.DESCENDING)) { pre = 9999; } for (ScoredDocument doc : results) { assertEquals(2, doc.getFieldNames().size()); for (Field numField : doc.getFields("numfield")) { if (direction.equals(SortExpression.SortDirection.DESCENDING)) { assertTrue(pre > numField.getNumber()); } else { assertTrue(pre < numField.getNumber()); } pre = numField.getNumber(); } } }}