1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.crawler.service;
17
18 import java.util.List;
19 import java.util.Map;
20
21 import org.apache.logging.log4j.LogManager;
22 import org.apache.logging.log4j.Logger;
23 import org.codelibs.fess.crawler.entity.OpenSearchUrlQueue;
24 import org.codelibs.fess.crawler.service.impl.OpenSearchUrlQueueService;
25 import org.codelibs.fess.crawler.util.OpenSearchCrawlerConfig;
26 import org.codelibs.fess.helper.CrawlingConfigHelper;
27 import org.codelibs.fess.opensearch.config.exentity.CrawlingConfig;
28 import org.codelibs.fess.opensearch.config.exentity.CrawlingConfig.ConfigName;
29 import org.codelibs.fess.util.ComponentUtil;
30 import org.opensearch.index.query.QueryBuilders;
31 import org.opensearch.index.query.functionscore.FunctionScoreQueryBuilder;
32 import org.opensearch.index.query.functionscore.RandomScoreFunctionBuilder;
33 import org.opensearch.search.sort.SortBuilders;
34 import org.opensearch.search.sort.SortOrder;
35
36
37
38
39
40
41 public class FessUrlQueueService extends OpenSearchUrlQueueService {
42
43 private static final Logger logger = LogManager.getLogger(FessUrlQueueService.class);
44
45
46 protected static final String ORDER_SEQUENTIAL = "sequential";
47
48
49 protected static final String ORDER_RANDOM = "random";
50
51
52
53
54
55
56 public FessUrlQueueService(final OpenSearchCrawlerConfig crawlerConfig) {
57 super(crawlerConfig);
58 }
59
60
61
62
63
64
65
66
67 @Override
68 protected List<OpenSearchUrlQueue> fetchUrlQueueList(final String sessionId) {
69 final CrawlingConfigHelper crawlingConfigHelper = ComponentUtil.getCrawlingConfigHelper();
70 final CrawlingConfig crawlingConfig = crawlingConfigHelper.get(sessionId);
71 final Map<String, String> configParams = crawlingConfig.getConfigParameterMap(ConfigName.CONFIG);
72 final String crawlOrder = configParams.getOrDefault(CrawlingConfig.Param.Config.CRAWL_ORDER, ORDER_SEQUENTIAL);
73 if (ORDER_RANDOM.equals(crawlOrder)) {
74 return getList(OpenSearchUrlQueue.class, sessionId,
75 QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(),
76 new FunctionScoreQueryBuilder.FilterFunctionBuilder[] { new FunctionScoreQueryBuilder.FilterFunctionBuilder(
77 new RandomScoreFunctionBuilder().seed(sessionId.hashCode())) }),
78 0, pollingFetchSize, SortBuilders.scoreSort().order(SortOrder.DESC));
79 } else if (!ORDER_SEQUENTIAL.equals(crawlOrder)) {
80 logger.warn("Invalid crawl order specified: {}. Falling back to sequential.", crawlOrder);
81 }
82 return super.fetchUrlQueueList(sessionId);
83 }
84 }