directorySelectClass = clazz;\r
}\r
\r
-// queryString = queryString.toLowerCase();\r
\r
- StringBuilder luceneQueryTemplate = new StringBuilder();\r
BooleanQuery finalQuery = new BooleanQuery();\r
BooleanQuery textQuery = new BooleanQuery();\r
- Set<String> freetextFields = new HashSet<String>();\r
\r
LuceneSearch luceneSearch = new LuceneSearch(getSession(), directorySelectClass);\r
- QueryFactory queryBuilder = new QueryFactory(luceneSearch);\r
+ QueryFactory queryFactory = new QueryFactory(luceneSearch);\r
\r
// ---- search criteria\r
-\r
-// luceneQueryTemplate.append("+(");\r
-// luceneQueryTemplate.append("titleCache:(%1$s) ");\r
- freetextFields.add("titleCache");\r
- textQuery.add(queryBuilder.newTermQuery("titleCache", queryString), Occur.SHOULD);\r
+ textQuery.add(queryFactory.newTermQuery("titleCache", queryString), Occur.SHOULD);\r
\r
// common name\r
- freetextFields.add("name");\r
-\r
Query nameQuery;\r
if(languages == null || languages.size() == 0){\r
-// luceneQueryTemplate.append("name:(%1$s) ");\r
- nameQuery = queryBuilder.newTermQuery("name", queryString);\r
+ nameQuery = queryFactory.newTermQuery("name", queryString);\r
} else {\r
nameQuery = new BooleanQuery();\r
BooleanQuery languageSubQuery = new BooleanQuery();\r
-// luceneQueryTemplate.append("(+name:(%1$s) ");\r
for(Language lang : languages){\r
-// luceneQueryTemplate.append(" +language.uuid:" + lang.getUuid().toString());\r
- languageSubQuery.add(queryBuilder.newTermQuery("language.uuid", lang.getUuid().toString()), Occur.SHOULD);\r
+ languageSubQuery.add(queryFactory.newTermQuery("language.uuid", lang.getUuid().toString()), Occur.SHOULD);\r
}\r
- ((BooleanQuery) nameQuery).add(queryBuilder.newTermQuery("name", queryString), Occur.MUST);\r
+ ((BooleanQuery) nameQuery).add(queryFactory.newTermQuery("name", queryString), Occur.MUST);\r
((BooleanQuery) nameQuery).add(languageSubQuery, Occur.MUST);\r
-// luceneQueryTemplate.append(")");\r
}\r
textQuery.add(nameQuery, Occur.SHOULD);\r
\r
\r
// text field from TextData\r
- freetextFields.add("text.ALL");\r
-// appendLocalizedFieldQuery("text", languages, luceneQueryTemplate).append(" ");\r
- textQuery.add(queryBuilder.newLocalizedTermQuery("text", queryString, languages), Occur.SHOULD);\r
+ textQuery.add(queryFactory.newLocalizedTermQuery("text", queryString, languages), Occur.SHOULD);\r
\r
// --- TermBase fields - by representation ----\r
// state field from CategoricalData\r
- freetextFields.add("states.state.representation.ALL");\r
-// appendLocalizedFieldQuery("states.state.representation", languages, luceneQueryTemplate).append(" ");\r
- textQuery.add(queryBuilder.newLocalizedTermQuery("states.state.representation", queryString, languages), Occur.SHOULD);\r
+ textQuery.add(queryFactory.newLocalizedTermQuery("states.state.representation", queryString, languages), Occur.SHOULD);\r
\r
// state field from CategoricalData\r
- freetextFields.add("states.modifyingText.ALL");\r
-// appendLocalizedFieldQuery("states.modifyingText", languages, luceneQueryTemplate).append(" ");\r
- textQuery.add(queryBuilder.newLocalizedTermQuery("states.modifyingText", queryString, languages), Occur.SHOULD);\r
-// luceneQueryTemplate.append(") ");\r
+ textQuery.add(queryFactory.newLocalizedTermQuery("states.modifyingText", queryString, languages), Occur.SHOULD);\r
\r
finalQuery.add(textQuery, Occur.MUST);\r
// --- classification ----\r
\r
if(classification != null){\r
-// luceneQueryTemplate.append("+inDescription.taxon.taxonNodes.classification.id:").append(PaddedIntegerBridge.paddInteger(classification.getId())).append(" ");\r
- finalQuery.add(queryBuilder.newEntityIdQuery("inDescription.taxon.taxonNodes.classification.id", classification), Occur.MUST);\r
+ finalQuery.add(queryFactory.newEntityIdQuery("inDescription.taxon.taxonNodes.classification.id", classification), Occur.MUST);\r
}\r
\r
// --- IdentifieableEntity fields - by uuid\r
if(features != null && features.size() > 0 ){\r
- finalQuery.add(queryBuilder.newEntityUuidQuery("feature.uuid", features), Occur.MUST);\r
-// luceneQueryTemplate.append("+feature.uuid:(");\r
-// for(Feature feature : features){\r
-// luceneQueryTemplate.append(feature.getUuid()).append(" ");\r
-// }\r
-// luceneQueryTemplate.append(") ");\r
+ finalQuery.add(queryFactory.newEntityUuidQuery("feature.uuid", features), Occur.MUST);\r
}\r
\r
// the description must be associated with a taxon\r
-// luceneQueryTemplate.append("+inDescription.taxon.id:[ " + PaddedIntegerBridge.paddInteger(0) + " TO " + PaddedIntegerBridge.paddInteger(Integer.MAX_VALUE) + "] ");\r
- //luceneQueryTemplate.append("-inDescription.taxon.id:" + PaddedIntegerBridge.NULL_STRING);\r
- finalQuery.add(queryBuilder.newIdNotNullQuery("inDescription.taxon.id"), Occur.MUST);\r
-\r
-// String luceneQueryStr = String.format(luceneQueryTemplate.toString(), queryString);\r
+ finalQuery.add(queryFactory.newIdNotNullQuery("inDescription.taxon.id"), Occur.MUST);\r
\r
- // --- sort fields\r
SortField[] sortFields = new SortField[]{SortField.FIELD_SCORE, new SortField("inDescription.taxon.titleCache__sort", false)};\r
\r
- // ---- execute criteria\r
-\r
-\r
-// Query luceneQuery = luceneSearch.parse(luceneQueryStr);\r
TopDocs topDocsResultSet = luceneSearch.executeSearch(finalQuery, clazz, pageSize, pageNumber, sortFields);\r
\r
String[] highlightFields = null;\r
if(highlightFragments){\r
- highlightFields = freetextFields.toArray(new String[freetextFields.size()]);\r
+ highlightFields = queryFactory.getTextFieldNames().toArray(new String[queryFactory.getTextFieldNames().size()]);\r
}\r
\r
// initialize taxa, thighlight matches ....\r
*/
package eu.etaxonomy.cdm.api.service.search;
-import java.util.Collection;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import org.apache.log4j.Logger;
import org.apache.lucene.index.Term;
private LuceneSearch luceneSearch;
+ Set<String> textFieldNames = new HashSet<String>();
+
+ public Set<String> getTextFieldNames() {
+ return textFieldNames;
+ }
+
public QueryFactory(LuceneSearch luceneSearch){
this.luceneSearch = luceneSearch;
}
/**
- *
* @param fieldName
* @param queryString
- * @return a {@link TermQuery} or a {@link WildcardQuery}
+ * @param isTextField whether this field is a field containing free text in contrast to e.g. ID fields.
+ * @return
*/
- public Query newTermQuery(String fieldName, String queryString){
+ public Query newTermQuery(String fieldName, String queryString, boolean isTextField){
+
+ if(isTextField){
+ textFieldNames.add(fieldName);
+ }
- // in order to support the full query syntax we must use the parser here
+ // in order to support the full query syntax we must use the parser here
String luceneQueryString = fieldName + ":(" + queryString + ")";
try {
return luceneSearch.parse(luceneQueryString);
return null;
}
+ /**
+ * only to be used for text fields, see {@link #newTermQuery(String, String, boolean)}
+ * @param fieldName
+ * @param queryString
+ * @return a {@link TermQuery} or a {@link WildcardQuery}
+ */
+ public Query newTermQuery(String fieldName, String queryString){
+ return newTermQuery(fieldName, queryString, true);
+ }
+
/**
* DefinedTerm representations and MultilanguageString maps are stored in the Lucene index by the {@link DefinedTermBaseClassBridge}
* and {@link MultilanguageTextFieldBridge } in a consistent way. One field per language and also in one additional field for all languages.
* @return
*/
public Query newEntityIdQuery(String idFieldName, CdmBase entitiy){
- return newTermQuery("inDescription.taxon.taxonNodes.classification.id", PaddedIntegerBridge.paddInteger(entitiy.getId()));
+ return newTermQuery("inDescription.taxon.taxonNodes.classification.id", PaddedIntegerBridge.paddInteger(entitiy.getId()), false);
}
/**
BooleanQuery uuidInQuery = new BooleanQuery();
if(entities != null && entities.size() > 0 ){
for(IdentifiableEntity entity : entities){
- uuidInQuery.add(newTermQuery(uuidFieldName, entity.getUuid().toString()), Occur.SHOULD);
+ uuidInQuery.add(newTermQuery(uuidFieldName, entity.getUuid().toString(), false), Occur.SHOULD);
}
}
return uuidInQuery;