|
|
@@ -1202,15 +1202,74 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public SPage<Object> getAllObjects(String tableName, int page, int size) {
|
|
|
- SPage<Document> documents = SearchUtils.getAllDocuments(tableName, page, size);
|
|
|
- SPage<Object> sPage = new SPage<Object>(documents.getTotalPage(), documents.getTotalElement(),
|
|
|
- documents.getPage(), documents.getSize(), documents.isFirst(), documents.isLast());
|
|
|
- List<Object> content = new ArrayList<>();
|
|
|
- for (Document document : documents.getContent()) {
|
|
|
- content.add(DocumentToObjectUtils.toObject(document, tableName));
|
|
|
+ public SPage<Object> getObjects(String tableName, String keyword, String field, Boolean tokenized, int page,
|
|
|
+ int size) {
|
|
|
+ if (keyword == null) {
|
|
|
+ keyword = "";
|
|
|
+ }
|
|
|
+ if (field == null) {
|
|
|
+ field = SearchUtils.getIdField(tableName);
|
|
|
+ }
|
|
|
+ if (tokenized == null) {
|
|
|
+ tokenized = false;
|
|
|
+ }
|
|
|
+ IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(tableName);
|
|
|
+ SPage<Object> sPage = new SPage<>();
|
|
|
+ try {
|
|
|
+ Query query;
|
|
|
+ if (tokenized) {
|
|
|
+ query = SearchUtils.getBooleanQuery(field, keyword);
|
|
|
+ } else {
|
|
|
+ query = SearchUtils.getRegexpQuery(field, keyword);
|
|
|
+ }
|
|
|
+ // 分页信息
|
|
|
+ if (page > 0) {
|
|
|
+ sPage.setPage(page);
|
|
|
+ } else {
|
|
|
+ sPage.setPage(1);
|
|
|
+ sPage.setFirst(true);
|
|
|
+ }
|
|
|
+ if (size > 0) {
|
|
|
+ sPage.setSize(size);
|
|
|
+ } else {
|
|
|
+ sPage.setSize(20);
|
|
|
+ }
|
|
|
+
|
|
|
+ TopDocs topDocs;
|
|
|
+ // 如果页码不为1
|
|
|
+ if (sPage.getPage() > 1) {
|
|
|
+ TopDocs previousTopDocs = indexSearcher.search(query, (sPage.getPage() - 1) * sPage.getSize());
|
|
|
+ int totalHits = previousTopDocs.totalHits;
|
|
|
+ ScoreDoc[] previousScoreDocs = previousTopDocs.scoreDocs;
|
|
|
+ if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
|
|
|
+ throw new SearchException("页码过大:元素总数量为" + totalHits);
|
|
|
+ }
|
|
|
+ topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], query,
|
|
|
+ sPage.getSize());
|
|
|
+ } else {
|
|
|
+ sPage.setFirst(true);
|
|
|
+ topDocs = indexSearcher.search(query, sPage.getSize());
|
|
|
+ }
|
|
|
+
|
|
|
+ int totalHits = topDocs.totalHits;
|
|
|
+ // 设置总元素个数、页数等信息
|
|
|
+ sPage.setTotalElement(totalHits);
|
|
|
+ int totalPage = (int) Math.ceil(totalHits / (1.0 * sPage.getSize()));
|
|
|
+ sPage.setTotalPage(totalPage);
|
|
|
+ if (totalPage == sPage.getPage()) {
|
|
|
+ sPage.setLast(true);
|
|
|
+ }
|
|
|
+ List<Object> content = new ArrayList<>();
|
|
|
+ for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
|
|
|
+ Document document = indexSearcher.doc(scoreDoc.doc);
|
|
|
+ content.add(DocumentToObjectUtils.toObject(document, tableName));
|
|
|
+ }
|
|
|
+ sPage.setContent(content);
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new SearchException(e).setDetailedMessage(e);
|
|
|
+ } finally {
|
|
|
+ SearchUtils.releaseIndexSearcher(indexSearcher);
|
|
|
}
|
|
|
- sPage.setContent(content);
|
|
|
return sPage;
|
|
|
}
|
|
|
|