@Override protected <P extends Project> TermMatchingContext setFullTextSearchFields(WildcardContext wc, Class<P> clazz) { if (Project.class.isAssignableFrom(clazz)) { return wc.onField("name"). andField("description"). andField("nodeKey"). andField("children.name"). andField("children.description"). andField("children.nodeKey"). andField("programmingLanguages_name"). andField("topics_name"). andField("customerTypes_name"). andField("projectTypes_name"). andField("softwareTypes_name"). andField("softwareLicenses_name"). andField("issueTrackingTools_name"). andField("sourceCodeManagementTools_name"). andField("staticAnalysisTools_name"). andField("testManagementTools_name"). andField("continuousIntegrationTools_name"). andField("softwareDevelopmentMethodologies_name"); } else { return super.setFullTextSearchFields(wc, clazz); } }
@Override protected <P extends QMTreeNode> TermMatchingContext setFullTextSearchFields(WildcardContext wc, Class<P> clazz) { if (QMTreeNode.class.isAssignableFrom(clazz)) { return wc.onField("name"). andField("description"). andField("nodeKey"). andField("children.name"). andField("children.description"). andField("children.mKey"); } else { return super.setFullTextSearchFields(wc, clazz); } }
@Override protected <P extends TreeNode> TermMatchingContext setFullTextSearchFields(WildcardContext wc, Class<P> clazz) { if (TreeNode.class.isAssignableFrom(clazz)) { return wc.onField("name"). andField("description"). andField("nodeKey"). andField("children.name"). andField("children.description"). andField("children.nodeKey"); } else { return super.setFullTextSearchFields(wc, clazz); } }
private <P extends T> Collection<Long> fullTextSearchForIds(Class<P> clazz, String... terms) { FullTextEntityManager ftem = Search.getFullTextEntityManager(em); QueryBuilder qb = ftem.getSearchFactory().buildQueryBuilder(). forEntity(clazz).get(); Query luceneQuery; WildcardContext wc = qb.keyword().wildcard(); TermMatchingContext tmc = setFullTextSearchFields(wc, clazz); Set<Long> results = new HashSet<>(); try { for (String term : terms) { luceneQuery = tmc.ignoreAnalyzer().ignoreFieldBridge(). matching(term.toLowerCase()).createQuery(); FullTextQuery query = ftem. createFullTextQuery(luceneQuery, clazz); query.setProjection("id"); List<Object[]> idList = query.getResultList(); for (Object[] id : idList) { if (id[0] instanceof Long) { results.add((Long) id[0]); } } } } catch (Exception e) { // because of lucene stop words logger.warn(e.getMessage(), e); } return results; }
private TermMatchingContext keywordOnField(String fieldName) { return queryBuilder .keyword().onField(fieldName); }
protected <P extends T> TermMatchingContext setFullTextSearchFields(WildcardContext wc, Class<P> clazz) { return wc.onField(AbstractEntity_.id.getName()); }
@Override protected <P extends Product> TermMatchingContext setFullTextSearchFields(WildcardContext wc, Class<P> clazz) { return wc.onField("name").andField("description"); }
@Override protected <P extends Team> TermMatchingContext setFullTextSearchFields(WildcardContext wc, Class<P> clazz) { return wc.onField("name"); }
@Override protected <P extends User> TermMatchingContext setFullTextSearchFields(WildcardContext wc, Class<P> clazz) { return wc.onField("firstName").andField("lastName"); }
@Override protected <P extends Process> TermMatchingContext setFullTextSearchFields(WildcardContext wc, Class<P> clazz) { return wc.onField("name").andField("description").andField("stages"); }
@Override public <T> Query build(FullTextEntityManager fullTextEntityManager, StringTermSelector<T> termSelector, Class<? extends T> type) { QueryBuilder builder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(type).get(); BooleanJunction<?> context = builder.bool(); boolean valid = false; if (termSelector.isNotEmpty()) { boolean hasTerms = false; BooleanJunction<?> termContext = builder.bool(); for (String selected : termSelector.getSelected()) { if (isNotBlank(selected)) { String[] values = selected.split(PUNCTUATION); for (String value : values) { if (isNotBlank(value) && (value.length() > 2)) { List<String> fields = termSelector.getPaths(); BooleanJunction<?> valueContext = builder.bool(); addFuzzyMatch(builder, value, fields, termSelector.getSearchSimilarity(), valueContext); addKeywordMatch(builder, value, fields, valueContext); // wildcard search // no #onFields on wildcardContext WildcardContext wildcardContext = builder.keyword().wildcard(); TermMatchingContext termMatchingContext = null; for (String field : fields) { if (termMatchingContext != null) { termMatchingContext = termMatchingContext.andField(field); } else { termMatchingContext = wildcardContext.onField(field); } } valueContext.should(termMatchingContext. // matching("*" + value + "*").createQuery()); if (termSelector.isOrMode()) { termContext.should(valueContext.createQuery()); } else { termContext.must(valueContext.createQuery()); } hasTerms = true; } } } } if (hasTerms) { context.must(termContext.createQuery()); valid = true; } } return createQuery(builder, context, valid); }