public void init(String searchTerm, String text, String entityName) { init(searchTerm, text, entityName, null); }
public boolean hasMoreTokens() { skipDelimiters(); return currentPos <= maxPos; }
@Override protected boolean isTokenChar(int c) { return FTS.isTokenChar(c); } }
@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; } }
private void makeFieldText(List<String> terms, String fieldName, String fieldText, boolean likeSearch, Normalizer normalizer) { StringBuilder sb = new StringBuilder(); FTS.Tokenizer tokenizer = new FTS.Tokenizer(fieldText); while (tokenizer.hasMoreTokens()) { String word = tokenizer.nextToken().toLowerCase(); List<String> normalForms = null; if (normalizer != null) { normalForms = normalizer.getAllNormalForms(word); normalTerm = normalizer.getAnyNormalForm(term); makePartTextField(tokenizer, fieldText, sb); } else { if (!likeSearch && normalizer != null) { for (String form : normalForms) { if (form.equals(normalTerm)) { makePartTextField(tokenizer, fieldText, sb); break;
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 makePartTextField(FTS.Tokenizer tokenizer, String fieldText, StringBuilder sb) { int start = Math.max(tokenizer.getTokenStart() - FTS.HIT_CONTEXT_PAD, 0); while (start > 0 && FTS.isTokenChar(fieldText.charAt(start))) start--; int end = Math.min(tokenizer.getTokenEnd() + FTS.HIT_CONTEXT_PAD, fieldText.length()); while (end < fieldText.length() && FTS.isTokenChar(fieldText.charAt(end))) end++; if (start > 0 && !sb.toString().endsWith("...")) sb.append("..."); sb.append(fieldText.substring(start, tokenizer.getTokenStart())); sb.append("<b>"); sb.append(fieldText.substring(tokenizer.getTokenStart(), tokenizer.getTokenEnd())); sb.append("</b>"); if (end <= fieldText.length()) { sb.append(fieldText.substring(tokenizer.getTokenEnd(), end)); if (end < fieldText.length()) { sb.append("..."); } } }
public String nextToken() { skipDelimiters(); tokenStart = currentPos; int pos = currentPos; while (pos <= maxPos && isTokenChar(input.charAt(pos))) { pos++; } if (pos > currentPos) { String token = input.substring(currentPos, pos); currentPos = pos; tokenEnd = pos; return token; } return null; }
public int getIdsCount() { return queryKey.getIds().size(); }
public void addId(Object id, String entityName, String text) { ids.add(new EntityKey(id, entityName, text)); }
public SearchResult(String searchTerm) { this.searchTerm = searchTerm; this.queryKey = new QueryKey(); }
@Override public boolean isEnabled() { try { return ftsConfig.getEnabled(); } catch (Exception e) { log.error("Unable to find out if FTS is enabled: {}", e.toString()); return false; } }
@Authenticated @Override public void setEnabled(boolean value) { ftsConfig.setEnabled(value); }
public void addEntry(SearchResultEntry entry) { Set<SearchResultEntry> set = results.computeIfAbsent(entry.getEntityName(), k -> new LinkedHashSet<>()); set.add(entry); }
protected Button createInstanceButton(String entityName, SearchResultEntry entry) { LinkButton instanceBtn = componentsFactory.createComponent(LinkButton.class); instanceBtn.setStyleName("fts-found-instance"); BaseAction action = new BaseAction("instanceButton"); action.withCaption(entry.getCaption()); action.withHandler(e -> onInstanceClick(entityName, entry)); instanceBtn.setAction(action); return instanceBtn; }
private void skipDelimiters() { int pos = currentPos; while (pos <= maxPos && !isTokenChar(input.charAt(pos))) { pos++; } currentPos = pos; } }
public HitInfo getHitInfo(Object id, String entityName) { return hits.get(new EntityKey(id, entityName)); }