use of org.springframework.data.elasticsearch.core.SearchHit in project spring-data-elasticsearch by spring-projects.
the class ReactiveSearchAfterIntegrationTests method shouldReadPagesWithSearchAfter.
// #1143
@Test
@DisplayName("should read pages with search_after")
void shouldReadPagesWithSearchAfter() {
List<Entity> entities = IntStream.rangeClosed(1, 10).mapToObj(i -> new Entity((long) i, "message " + i)).collect(Collectors.toList());
operations.saveAll(Mono.just(entities), Entity.class).blockLast();
Query query = Query.findAll();
query.setPageable(PageRequest.of(0, 3));
query.addSort(Sort.by(Sort.Direction.ASC, "id"));
List<Object> searchAfter = null;
List<Entity> foundEntities = new ArrayList<>();
int loop = 0;
do {
query.setSearchAfter(searchAfter);
List<SearchHit<Entity>> searchHits = operations.search(query, Entity.class).collectList().block();
if (searchHits.size() == 0) {
break;
}
foundEntities.addAll(searchHits.stream().map(searchHit -> searchHit.getContent()).collect(Collectors.toList()));
searchAfter = searchHits.get((int) (searchHits.size() - 1)).getSortValues();
if (++loop > 10) {
fail("loop not terminating");
}
} while (true);
assertThat(foundEntities).containsExactlyElementsOf(entities);
}
use of org.springframework.data.elasticsearch.core.SearchHit in project fh by assecopl.
the class GenericDtoService method listDto.
@Override
public List<LIST> listDto(QUERY query) {
BoolQueryBuilder queryBuilder = createQueryBuilderInternal(query);
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(queryBuilder);
if (query.getFirstRow() != null && query.getSize() != null) {
Sort sort;
if (query.getSortProperty() != null) {
sort = Sort.by((query.getAscending() != null && !query.getAscending()) ? Sort.Direction.DESC : Sort.Direction.ASC, query.getSortProperty());
} else {
sort = Sort.by(Sort.Direction.ASC, "id");
}
Pageable pageable;
// bez sortowania jesli SortProperty = "0"
if (query.getSortProperty() != null && query.getSortProperty().equals("0"))
pageable = PageRequest.of(query.getFirstRow() / query.getSize(), query.getSize());
else
pageable = PageRequest.of(query.getFirstRow() / query.getSize(), query.getSize(), sort);
searchQueryBuilder = searchQueryBuilder.withPageable(pageable);
}
NativeSearchQuery searchQuery = searchQueryBuilder.build();
List<LIST> list = new ArrayList<>();
try {
IndexCoordinates indexCoordinates = elasticsearchTemplate.getIndexCoordinatesFor(listClazz);
SearchHits<LIST> res = elasticsearchTemplate.search(searchQuery, listClazz, indexCoordinates);
list = res.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
} catch (Exception e) {
log.warn("{}", ExceptionUtils.getStackTrace(e));
}
return list;
}
use of org.springframework.data.elasticsearch.core.SearchHit in project openvsx by eclipse.
the class DatabaseSearchService method search.
@Cacheable("database.search")
public SearchHits<ExtensionSearch> search(ISearchService.Options options, Pageable pageRequest) {
// grab all extensions
var matchingExtensions = repositories.findAllActiveExtensions();
// no extensions in the database
if (matchingExtensions.isEmpty()) {
Aggregations aggregations = new Aggregations(Collections.emptyList());
return new SearchHitsImpl<ExtensionSearch>(0, TotalHitsRelation.OFF, 0f, "", Collections.emptyList(), aggregations);
}
// filter category
if (options.category != null) {
matchingExtensions = matchingExtensions.filter(extension -> extension.getLatest().getCategories().stream().anyMatch(category -> category.toLowerCase().equals(options.category.toLowerCase())));
}
// filter text
if (options.queryString != null) {
matchingExtensions = matchingExtensions.filter(extension -> extension.getName().toLowerCase().contains(options.queryString.toLowerCase()) || extension.getNamespace().getName().contains(options.queryString.toLowerCase()) || (extension.getLatest().getDescription() != null && extension.getLatest().getDescription().toLowerCase().contains(options.queryString.toLowerCase())) || (extension.getLatest().getDisplayName() != null && extension.getLatest().getDisplayName().toLowerCase().contains(options.queryString.toLowerCase())));
}
List<ExtensionSearch> sortedExtensions;
if ("relevance".equals(options.sortBy)) {
// for relevance we're using relevance service to get the relevance item
var searchStats = new SearchStats(repositories);
// needs to add relevance on extensions
sortedExtensions = new ArrayList<>(matchingExtensions.map(extension -> relevanceService.toSearchEntry(extension, searchStats)).toList());
// sort it
sortedExtensions.sort(new RelevanceComparator());
} else {
sortedExtensions = matchingExtensions.stream().map(extension -> extension.toSearch()).collect(Collectors.toList());
if ("downloadCount".equals(options.sortBy)) {
sortedExtensions.sort(new DownloadedCountComparator());
} else if ("averageRating".equals(options.sortBy)) {
sortedExtensions.sort(new AverageRatingComparator());
} else if ("timestamp".equals(options.sortBy)) {
sortedExtensions.sort(new TimestampComparator());
}
}
// 'asc' | 'desc';
if ("desc".equals(options.sortOrder)) {
// reverse the order
Collections.reverse(sortedExtensions);
}
// Paging
var totalHits = sortedExtensions.size();
if (pageRequest != null) {
var pageNumber = pageRequest.getPageNumber();
var pageSize = pageRequest.getPageSize();
var toSkip = 0;
if (pageNumber >= 1) {
// page is zero indexed
toSkip = pageNumber * (pageSize - 1) + pageNumber;
}
// if something to skip, remove the first elements
if (toSkip > 0 && toSkip < sortedExtensions.size()) {
sortedExtensions = sortedExtensions.subList(toSkip, sortedExtensions.size());
}
// keep only the pageSize elements
if (sortedExtensions.size() > pageSize) {
sortedExtensions = sortedExtensions.subList(0, pageSize);
}
}
List<SearchHit<ExtensionSearch>> searchHits;
if (sortedExtensions.isEmpty()) {
searchHits = Collections.emptyList();
} else {
// client is interested only in the extension IDs
searchHits = sortedExtensions.stream().map(extensionSearch -> {
return new SearchHit<ExtensionSearch>(null, null, 0.0f, Collections.emptyList().toArray(), Collections.emptyMap(), extensionSearch);
}).collect(Collectors.toList());
}
Aggregations aggregations = new Aggregations(Collections.emptyList());
SearchHits<ExtensionSearch> searchHitsResult = new SearchHitsImpl<ExtensionSearch>(totalHits, TotalHitsRelation.OFF, 0f, "", searchHits, aggregations);
return searchHitsResult;
}
use of org.springframework.data.elasticsearch.core.SearchHit in project spring-data-elasticsearch by spring-projects.
the class SimpleElasticsearchRepository method findAll.
@SuppressWarnings("unchecked")
@Override
public Iterable<T> findAll(Sort sort) {
int itemCount = (int) this.count();
if (itemCount == 0) {
return new PageImpl<>(Collections.emptyList());
}
NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withPageable(PageRequest.of(0, itemCount, sort)).build();
List<SearchHit<T>> searchHitList = execute(operations -> operations.search(query, entityClass, getIndexCoordinates()).getSearchHits());
return (List<T>) SearchHitSupport.unwrapSearchHits(searchHitList);
}
use of org.springframework.data.elasticsearch.core.SearchHit in project openvsx by eclipse.
the class LocalRegistryService method toSearchEntry.
private SearchEntryJson toSearchEntry(SearchHit<ExtensionSearch> searchHit, String serverUrl, ISearchService.Options options) {
var searchItem = searchHit.getContent();
var extension = entityManager.find(Extension.class, searchItem.id);
if (extension == null || !extension.isActive()) {
extension = new Extension();
extension.setId(searchItem.id);
search.removeSearchEntry(extension);
return null;
}
var extVer = extension.getLatest();
var entry = extVer.toSearchEntryJson();
entry.url = createApiUrl(serverUrl, "api", entry.namespace, entry.name);
entry.files = Maps.newLinkedHashMapWithExpectedSize(2);
storageUtil.addFileUrls(extVer, serverUrl, entry.files, DOWNLOAD, ICON);
if (options.includeAllVersions) {
var allVersions = Lists.newArrayList(repositories.findActiveVersions(extension));
Collections.sort(allVersions, ExtensionVersion.SORT_COMPARATOR);
entry.allVersions = CollectionUtil.map(allVersions, ev -> toVersionReference(ev, entry, serverUrl));
}
return entry;
}
Aggregations