1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.job;
17
18 import java.util.Map;
19 import java.util.Set;
20 import java.util.stream.Collectors;
21
22 import org.apache.logging.log4j.LogManager;
23 import org.apache.logging.log4j.Logger;
24 import org.codelibs.core.lang.StringUtil;
25 import org.codelibs.fesen.index.query.QueryBuilder;
26 import org.codelibs.fesen.script.Script;
27 import org.codelibs.fess.es.client.SearchEngineClient;
28 import org.codelibs.fess.helper.LabelTypeHelper;
29 import org.codelibs.fess.helper.LanguageHelper;
30 import org.codelibs.fess.mylasta.direction.FessConfig;
31 import org.codelibs.fess.util.ComponentUtil;
32 import org.codelibs.fess.util.DocumentUtil;
33
34 public class UpdateLabelJob {
35
36 private static final Logger logger = LogManager.getLogger(UpdateLabelJob.class);
37
38 protected QueryBuilder queryBuilder = null;
39
40 public String execute() {
41 final SearchEngineClient searchEngineClient = ComponentUtil.getSearchEngineClient();
42 final FessConfig fessConfig = ComponentUtil.getFessConfig();
43 final LabelTypeHelper labelTypeHelper = ComponentUtil.getLabelTypeHelper();
44 final LanguageHelper languageHelper = ComponentUtil.getLanguageHelper();
45
46 final StringBuilder resultBuf = new StringBuilder();
47
48 try {
49 final long count = searchEngineClient.updateByQuery(fessConfig.getIndexDocumentUpdateIndex(), option -> {
50 if (queryBuilder != null) {
51 option.setQuery(queryBuilder);
52 }
53 return option.setFetchSource(new String[] { fessConfig.getIndexFieldUrl(), fessConfig.getIndexFieldLang() }, null);
54 }, (builder, hit) -> {
55 try {
56 final Map<String, Object> doc = hit.getSourceAsMap();
57 final String url = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class);
58 if (StringUtil.isNotBlank(url)) {
59 final Set<String> labelSet = labelTypeHelper.getMatchedLabelValueSet(url);
60 final Script script = languageHelper.createScript(doc, "ctx._source." + fessConfig.getIndexFieldLabel()
61 + "=new String[]{" + labelSet.stream().map(s -> "\"" + s + "\"").collect(Collectors.joining(",")) + "}");
62 return builder.setScript(script);
63 }
64 } catch (final Exception e) {
65 logger.warn("Failed to process {}", hit, e);
66 }
67 return null;
68 });
69 resultBuf.append(count).append(" docs").append("\n");
70 } catch (final Exception e) {
71 logger.error("Could not update labels.", e);
72 resultBuf.append(e.getMessage()).append("\n");
73 }
74
75 return resultBuf.toString();
76 }
77
78 public UpdateLabelJob query(final QueryBuilder queryBuilder) {
79 this.queryBuilder = queryBuilder;
80 return this;
81 }
82 }