|
|
@@ -2,6 +2,7 @@ package com.uas.search.console.b2b.service.impl;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.Calendar;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
@@ -56,14 +57,68 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
|
|
|
private Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
@Override
|
|
|
public SPage<Long> searchIds(String keyword, Table_name tableName, PageParams pageParams) throws SearchException {
|
|
|
IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(tableName);
|
|
|
+ // 获取单据的id
|
|
|
+ List<Long> content = new ArrayList<>();
|
|
|
+ try {
|
|
|
+ SPage<ScoreDoc> scoreDocPage = search(indexSearcher, keyword, tableName, pageParams);
|
|
|
+ SPage<Long> sPage = convertSPage(scoreDocPage, Long.class);
|
|
|
+ for (ScoreDoc scoreDoc : scoreDocPage.getContent()) {
|
|
|
+ Document document = indexSearcher.doc(scoreDoc.doc);
|
|
|
+ content.add(Long.valueOf(document.get(ClassAndTableNameUtils.getIdField(tableName))));
|
|
|
+ }
|
|
|
+ sPage.setContent(content);
|
|
|
+ return sPage;
|
|
|
+ } catch (NumberFormatException | IOException e) {
|
|
|
+ throw new SearchException(e).setDetailedMessage(e);
|
|
|
+ } finally {
|
|
|
+ SearchUtils.releaseIndexSearcher(indexSearcher);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换SPage
|
|
|
+ *
|
|
|
+ * @param scoreDocPage
|
|
|
+ * @param clazz
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private <T> SPage<T> convertSPage(SPage<ScoreDoc> scoreDocPage, Class<T> clazz) {
|
|
|
+ return new SPage<>(scoreDocPage.getTotalPage(), scoreDocPage.getTotalElement(), scoreDocPage.getPage(),
|
|
|
+ scoreDocPage.getSize(), scoreDocPage.isFirst(), scoreDocPage.isLast());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据关键词、单据类型、状态码搜索单据
|
|
|
+ *
|
|
|
+ * @param indexSearcher
|
|
|
+ *
|
|
|
+ * @param keyword
|
|
|
+ * 不为空,模糊搜索关键词,可以是:单据编号、供应商uu(采购)、供应商名称(采购)、客户uu(销售)、客户名称(销售)、
|
|
|
+ * 物料编号、 物料名称、物料规格
|
|
|
+ * @param tableName
|
|
|
+ * 不为空,单据类型
|
|
|
+ * @param pageParams
|
|
|
+ * 可为空,可能含有翻页信息,filters中可能有过滤信息,包括:1.状态、所属企业uu、其他状态(如已采纳、未采纳等),
|
|
|
+ * 该部分参数的键为数据库表中相应的字段名称,值为字段对应的值,若值有多个,则使用com.uas.search.b2b.
|
|
|
+ * model.MultiValue,则;2.开始时间(Long)、截止时间(Long),
|
|
|
+ * 这两个参数用于对时间范围进行筛选(包含开始和截止时间),键为com.uas.search.b2b.util.
|
|
|
+ * SearchConstants中的常量;3.排序方式(ArrayList(Sort)),键为com.uas.search.
|
|
|
+ * b2b.util.SearchConstants中的常量,值为List(com.uas.search.b2b.model.
|
|
|
+ * Sort)
|
|
|
+ * @return 单据数据
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ private SPage<ScoreDoc> search(IndexSearcher indexSearcher, String keyword, Table_name tableName,
|
|
|
+ PageParams pageParams) throws IOException {
|
|
|
+
|
|
|
// 获取该表keyword可以搜索的域
|
|
|
List<String> keywordFields = ClassAndTableNameUtils.getKeywordFields(tableName);
|
|
|
|
|
|
- SPage<Long> sPage = new SPage<>();
|
|
|
+ SPage<ScoreDoc> sPage = new SPage<>();
|
|
|
BooleanQuery booleanQuery = new BooleanQuery();
|
|
|
Sort sort = null;
|
|
|
|
|
|
@@ -180,59 +235,46 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
}
|
|
|
logger.info(booleanQuery.toString());
|
|
|
|
|
|
- try {
|
|
|
- TopDocs topDocs;
|
|
|
- // 如果页码不为1
|
|
|
- if (sPage.getPage() > 1) {
|
|
|
- TopDocs previousTopDocs = null;
|
|
|
- if (sort != null) {
|
|
|
- previousTopDocs = indexSearcher.search(booleanQuery, (sPage.getPage() - 1) * sPage.getSize(), sort);
|
|
|
- } else {
|
|
|
- previousTopDocs = indexSearcher.search(booleanQuery, (sPage.getPage() - 1) * sPage.getSize());
|
|
|
- }
|
|
|
- int totalHits = previousTopDocs.totalHits;
|
|
|
- ScoreDoc[] previousScoreDocs = previousTopDocs.scoreDocs;
|
|
|
- if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
|
|
|
- throw new SearchException("页码过大:元素总数量为" + totalHits);
|
|
|
- }
|
|
|
- if (sort != null) {
|
|
|
- topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], booleanQuery,
|
|
|
- sPage.getSize(), sort);
|
|
|
- } else {
|
|
|
- topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], booleanQuery,
|
|
|
- sPage.getSize());
|
|
|
- }
|
|
|
+ TopDocs topDocs;
|
|
|
+ // 如果页码不为1
|
|
|
+ if (sPage.getPage() > 1) {
|
|
|
+ TopDocs previousTopDocs = null;
|
|
|
+ if (sort != null) {
|
|
|
+ previousTopDocs = indexSearcher.search(booleanQuery, (sPage.getPage() - 1) * sPage.getSize(), sort);
|
|
|
} else {
|
|
|
- sPage.setFirst(true);
|
|
|
- if (sort != null) {
|
|
|
- topDocs = indexSearcher.search(booleanQuery, sPage.getSize(), sort);
|
|
|
- } else {
|
|
|
- topDocs = indexSearcher.search(booleanQuery, sPage.getSize());
|
|
|
- }
|
|
|
+ previousTopDocs = indexSearcher.search(booleanQuery, (sPage.getPage() - 1) * 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);
|
|
|
+ int totalHits = previousTopDocs.totalHits;
|
|
|
+ ScoreDoc[] previousScoreDocs = previousTopDocs.scoreDocs;
|
|
|
+ if ((sPage.getPage() - 1) * sPage.getSize() >= totalHits) {
|
|
|
+ throw new SearchException("页码过大:元素总数量为" + totalHits);
|
|
|
}
|
|
|
-
|
|
|
- // 获取单据的id
|
|
|
- ScoreDoc[] scoreDocs = topDocs.scoreDocs;
|
|
|
- List<Long> content = new ArrayList<>();
|
|
|
- for (ScoreDoc scoreDoc : scoreDocs) {
|
|
|
- Document document = indexSearcher.doc(scoreDoc.doc);
|
|
|
- content.add(Long.valueOf(document.get(ClassAndTableNameUtils.getIdField(tableName))));
|
|
|
+ if (sort != null) {
|
|
|
+ topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], booleanQuery,
|
|
|
+ sPage.getSize(), sort);
|
|
|
+ } else {
|
|
|
+ topDocs = indexSearcher.searchAfter(previousScoreDocs[previousScoreDocs.length - 1], booleanQuery,
|
|
|
+ sPage.getSize());
|
|
|
}
|
|
|
- sPage.setContent(content);
|
|
|
- } catch (NumberFormatException | IOException e) {
|
|
|
- throw new SearchException(e).setDetailedMessage(e);
|
|
|
- } finally {
|
|
|
- SearchUtils.releaseIndexSearcher(indexSearcher);
|
|
|
+ } else {
|
|
|
+ sPage.setFirst(true);
|
|
|
+ if (sort != null) {
|
|
|
+ topDocs = indexSearcher.search(booleanQuery, sPage.getSize(), sort);
|
|
|
+ } else {
|
|
|
+ topDocs = indexSearcher.search(booleanQuery, 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);
|
|
|
}
|
|
|
+
|
|
|
+ sPage.setContent(Arrays.asList(topDocs.scoreDocs));
|
|
|
logger.info(sPage + "\n");
|
|
|
return sPage;
|
|
|
}
|
|
|
@@ -255,6 +297,31 @@ public class SearchServiceImpl implements SearchService, InnerSearchService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public <T> SPage<T> getAllObjects(Class<T> clazz, int page, int size) {
|
|
|
+ Table_name tableName = ClassAndTableNameUtils.toTableName(clazz);
|
|
|
+ IndexSearcher indexSearcher = SearchUtils.getIndexSearcher(tableName);
|
|
|
+ // 获取单据的id
|
|
|
+ List<T> content = new ArrayList<>();
|
|
|
+ try {
|
|
|
+ PageParams pageParams = new PageParams();
|
|
|
+ pageParams.setPage(page);
|
|
|
+ pageParams.setSize(size);
|
|
|
+ SPage<ScoreDoc> scoreDocPage = search(indexSearcher, null, tableName, pageParams);
|
|
|
+ SPage<T> sPage = convertSPage(scoreDocPage, clazz);
|
|
|
+ for (ScoreDoc scoreDoc : scoreDocPage.getContent()) {
|
|
|
+ Document document = indexSearcher.doc(scoreDoc.doc);
|
|
|
+ content.add(DocumentToObjectUtils.toObject(document, clazz));
|
|
|
+ }
|
|
|
+ sPage.setContent(content);
|
|
|
+ return sPage;
|
|
|
+ } catch (NumberFormatException | IOException e) {
|
|
|
+ throw new SearchException(e).setDetailedMessage(e);
|
|
|
+ } finally {
|
|
|
+ SearchUtils.releaseIndexSearcher(indexSearcher);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取排序字段的类型
|
|
|
*
|