protected void searchByLinks(QueryKey queryKey, SearchResult searchResult, int maxSearchResults) { EntityKey currentEntityKey = queryKey == null ? null : queryKey.getLastId(); boolean skip = true; for (EntityKey entityKey : searchResult.getQueryKey().getIds()) { if (searchResult.getCount() >= maxSearchResults) { break; searchResult.getQueryKey().setLinksFirstResult(firstResult); searchResult.getQueryKey().setLastId(currentEntityKey); break; } else { List<EntityKey> ids = searchResult.getQueryKey().getIds(); if (ids.indexOf(currentEntityKey) == ids.size() - 1) { searchResult.getQueryKey().setLastId(null); searchResult.getQueryKey().setLinksFirstResult(0); searchResult.getQueryKey().setSearchByTermAgain(true); } else { searchResult.getQueryKey().setLastId(ids.get(ids.indexOf(currentEntityKey) + 1)); searchResult.getQueryKey().setLinksFirstResult(0);
@Override public SearchResult search(String searchTerm, QueryKey queryKey) { SearchResult searchResult = new SearchResult(searchTerm); int maxSearchResults = coreConfig.getMaxSearchResults(); boolean searchByTerm = false; if (queryKey == null || queryKey.isSearchByTermAgain()) { searchByTerm = true; searchByTerm(searchResult, searchTerm, queryKey, maxSearchResults); if (searchResult.getCount() == 0 && searchResult.getIdsCount() == 0) { return searchResult; } } if (!searchByTerm) { searchResult.getQueryKey().setIds(queryKey.getIds()); searchResult.getQueryKey().setFirstResult(queryKey.getFirstResult()); } searchByLinks(queryKey, searchResult, maxSearchResults); if (!searchByTerm && searchResult.getCount() == 0 && searchResult.getQueryKey().isSearchByTermAgain()) { return search(searchTerm, searchResult.getQueryKey()); } else { return searchResult; } }
protected void searchByTerm(SearchResult searchResult, String searchTerm, QueryKey queryKey, int maxSearchResults) { int currentCount = 0; int firstResult = queryKey == null ? 0 : queryKey.getFirstResult(); boolean emptyIndex = false; while (currentCount < maxSearchResults && !emptyIndex) { List<EntityInfo> indexResult = luceneSearcher.searchAllField(searchTerm, firstResult, maxSearchResults); if (!indexResult.isEmpty()) { databaseDataLoader.mergeSearchData(searchResult, indexResult, false, (entityId, entityInfo) -> { searchResult.addHit(entityId, entityInfo.getEntityName(), entityInfo.getText(), createNormalizer()); searchResult.getQueryKey().addId(entityId, entityInfo.getEntityName(), entityInfo.getText()); }); currentCount = Math.max(searchResult.getCount(), searchResult.getIdsCount()); firstResult += maxSearchResults; searchResult.getQueryKey().setFirstResult(firstResult); } else { emptyIndex = true; } } }
protected void openNextPage() { Page lastPage = getLastPage(); if (lastPage != null) { SearchResult lastSearchResult = lastPage.getSearchResult(); SearchResult searchResult = ftsService.search(lastSearchResult.getSearchTerm(), lastSearchResult.getQueryKey()); if (searchResult.getCount() == 0) { currentPage.setLastPage(true); paintNavigationControls(pages); showNotification(getMessage("notFound"), NotificationType.HUMANIZED); } else { currentPage = new Page(lastPage.getPageNumber() + 1); currentPage.setSearchResult(searchResult); pages.add(currentPage); paintResult(currentPage); paintNavigationControls(pages); } } }