import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;\r
import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
import eu.etaxonomy.cdm.model.description.TaxonInteraction;\r
+import eu.etaxonomy.cdm.model.description.TextData;\r
import eu.etaxonomy.cdm.model.media.Media;\r
import eu.etaxonomy.cdm.model.media.MediaRepresentation;\r
import eu.etaxonomy.cdm.model.media.MediaUtils;\r
return dao.getUuidAndTitleCacheSynonym();\r
}\r
\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#findByFullText(java.lang.Class, java.lang.String, eu.etaxonomy.cdm.model.taxon.Classification, java.util.List, boolean, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)\r
+ */\r
@Override\r
public Pager<SearchResult<TaxonBase>> findByFullText(\r
Class<? extends TaxonBase> clazz, String queryString,\r
Classification classification, List<Language> languages,\r
boolean highlightFragments, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) throws CorruptIndexException, IOException, ParseException {\r
\r
-// // -- set defaults\r
-// Class<? extends TaxonBase> directorySelectClass = TaxonBase.class;\r
-// if(clazz != null){\r
-// directorySelectClass = clazz;\r
-// }\r
- return null;\r
+ // -- set defaults\r
+ // abstract base classes cannot be used as directorySelectClass but any subclass will do!\r
+ Class<? extends TaxonBase> directorySelectClass = Taxon.class;\r
+ if(clazz != null){\r
+ if(clazz.equals(TaxonBase.class)){\r
+ clazz = null;\r
+ } else {\r
+ directorySelectClass = clazz;\r
+ }\r
+ }\r
+\r
+ BooleanQuery finalQuery = new BooleanQuery();\r
+ BooleanQuery textQuery = new BooleanQuery();\r
\r
+ LuceneSearch luceneSearch = new LuceneSearch(getSession(), directorySelectClass);\r
+ QueryFactory queryFactory = new QueryFactory(luceneSearch);\r
+\r
+ SortField[] sortFields = new SortField[]{SortField.FIELD_SCORE, new SortField("titleCache__sort", false)};\r
+\r
+ // ---- search criteria\r
+ textQuery.add(queryFactory.newTermQuery("titleCache", queryString), Occur.SHOULD);\r
+ textQuery.add(queryFactory.newDefinedTermBaseQuery("name.rank", queryString, languages), Occur.SHOULD);\r
+\r
+ finalQuery.add(textQuery, Occur.MUST);\r
+\r
+ if(classification != null){\r
+ finalQuery.add(queryFactory.newEntityIdQuery("taxonNodes.classification.id", classification), Occur.MUST);\r
+ }\r
+\r
+ String[] highlightFields = null;\r
+ if(highlightFragments){\r
+ highlightFields = queryFactory.getTextFieldNamesAsArray();\r
+ }\r
+\r
+ // --- execute search\r
+ TopDocs topDocsResultSet = luceneSearch.executeSearch(finalQuery, clazz, pageSize, pageNumber, sortFields);\r
+\r
+ // --- initialize taxa, thighlight matches ....\r
+ ISearchResultBuilder searchResultBuilder = new SearchResultBuilder(luceneSearch, finalQuery);\r
+ List<SearchResult<TaxonBase>> searchResults = searchResultBuilder.createResultSet(\r
+ topDocsResultSet, highlightFields, dao, "taxon.id", propertyPaths);\r
+\r
+ return new DefaultPagerImpl<SearchResult<TaxonBase>>(pageNumber, searchResults.size(), pageSize, searchResults);\r
}\r
\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.ITaxonService#findByDescriptionElementFullText(java.lang.Class, java.lang.String, eu.etaxonomy.cdm.model.taxon.Classification, java.util.List, java.util.List, boolean, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)\r
+ */\r
@Override\r
public Pager<SearchResult<TaxonBase>> findByDescriptionElementFullText(\r
Class<? extends DescriptionElementBase> clazz, String queryString,\r
boolean highlightFragments, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) throws CorruptIndexException, IOException, ParseException {\r
\r
// -- set defaults\r
- Class<? extends DescriptionElementBase> directorySelectClass = DescriptionElementBase.class;\r
+ // abstract base classes cannot be used as directorySelectClass but any subclass will do!\r
+ Class<? extends DescriptionElementBase> directorySelectClass = TextData.class;\r
if(clazz != null){\r
- directorySelectClass = clazz;\r
+ if(clazz.equals(TaxonBase.class)){\r
+ clazz = null;\r
+ } else {\r
+ directorySelectClass = clazz;\r
+ }\r
}\r
\r
-\r
BooleanQuery finalQuery = new BooleanQuery();\r
BooleanQuery textQuery = new BooleanQuery();\r
\r
LuceneSearch luceneSearch = new LuceneSearch(getSession(), directorySelectClass);\r
QueryFactory queryFactory = new QueryFactory(luceneSearch);\r
\r
+ SortField[] sortFields = new SortField[]{SortField.FIELD_SCORE, new SortField("inDescription.taxon.titleCache__sort", false)};\r
+\r
// ---- search criteria\r
textQuery.add(queryFactory.newTermQuery("titleCache", queryString), Occur.SHOULD);\r
\r
// the description must be associated with a taxon\r
finalQuery.add(queryFactory.newIdNotNullQuery("inDescription.taxon.id"), Occur.MUST);\r
\r
- SortField[] sortFields = new SortField[]{SortField.FIELD_SCORE, new SortField("inDescription.taxon.titleCache__sort", false)};\r
-\r
- TopDocs topDocsResultSet = luceneSearch.executeSearch(finalQuery, clazz, pageSize, pageNumber, sortFields);\r
\r
String[] highlightFields = null;\r
if(highlightFragments){\r
- highlightFields = queryFactory.getTextFieldNames().toArray(new String[queryFactory.getTextFieldNames().size()]);\r
+ highlightFields = queryFactory.getTextFieldNamesAsArray();\r
}\r
\r
- // initialize taxa, thighlight matches ....\r
+ // --- execute search\r
+ TopDocs topDocsResultSet = luceneSearch.executeSearch(finalQuery, clazz, pageSize, pageNumber, sortFields);\r
+\r
+ // --- initialize taxa, thighlight matches ....\r
ISearchResultBuilder searchResultBuilder = new SearchResultBuilder(luceneSearch, finalQuery);\r
List<SearchResult<TaxonBase>> searchResults = searchResultBuilder.createResultSet(\r
topDocsResultSet, highlightFields, dao, "inDescription.taxon.id", propertyPaths);\r
return textFieldNames;
}
+ public String[] getTextFieldNamesAsArray() {
+ return textFieldNames.toArray(new String[textFieldNames.size()]);
+ }
+
public QueryFactory(LuceneSearch luceneSearch){
this.luceneSearch = luceneSearch;
*/
public Query newLocalizedTermQuery(String name, String queryString, List<Language> languages) {
+ BooleanQuery localizedTermQuery = new BooleanQuery();
+ localizedTermQuery.add(newTermQuery(name + ".label", queryString), Occur.SHOULD);
if(languages == null || languages.size() == 0){
- return newTermQuery(name + ".ALL", queryString);
+ localizedTermQuery.add(newTermQuery(name + ".ALL", queryString), Occur.SHOULD);
} else {
- BooleanQuery localizedTermQuery = new BooleanQuery();
for(Language lang : languages){
localizedTermQuery.add(newTermQuery(name + "." + lang.getUuid().toString(), queryString), Occur.SHOULD);
}
- return localizedTermQuery;
}
+ return localizedTermQuery;
+ }
+
+ /**
+ * convenience method for localized searches on {@link DefinedTermBase}
+ * instances, it adds the field name suffix "representations" to the
+ * <code>name</code> parameter and calls
+ * {@link #newLocalizedTermQuery(String, String, List)}
+ *
+ * @param name
+ * @param queryString
+ * @param languages
+ * @return
+ */
+ public Query newDefinedTermBaseQuery(String name, String queryString, List<Language> languages) {
+ return newLocalizedTermQuery(name + ".representations", queryString, languages);
}
/**
Assert.assertTrue("first fragments should contains serch term", fragments[0].contains("<B>Pflanzenart</B> <B>aus</B> <B>der</B> <B>Gattung</B> <B>der</B> <B>Tannen</B>"));\r
}\r
\r
+\r
+ @Test\r
+ @DataSet\r
+ public final void testFindByFullText() throws CorruptIndexException, IOException, ParseException {\r
+\r
+ refreshLuceneIndex();\r
+\r
+ Pager<SearchResult<TaxonBase>> pager;\r
+// pager = taxonService.findByFullText(null, "Abies", null, null, true, null, null, null, null); // --> 7\r
+// Assert.assertEquals("Expecting 7 entities", Integer.valueOf(7), pager.getCount());\r
+\r
+ pager = taxonService.findByFullText(Taxon.class, "Abies", null, null, true, null, null, null, null); // --> 6\r
+ Assert.assertEquals("Expecting 6 entities", Integer.valueOf(6), pager.getCount());\r
+\r
+ pager = taxonService.findByFullText(Synonym.class, "Abies", null, null, true, null, null, null, null); // --> 1\r
+ Assert.assertEquals("Expecting 1 entity", Integer.valueOf(1), pager.getCount());\r
+\r
+ pager = taxonService.findByFullText(TaxonBase.class, "sec*", null, null, true, null, null, null, null); // --> 7\r
+ Assert.assertEquals("Expecting 7 entities", Integer.valueOf(7), pager.getCount());\r
+\r
+ pager = taxonService.findByFullText(null, "genus", null, null, true, null, null, null, null); // --> 1\r
+ Assert.assertEquals("Expecting 1 entity", Integer.valueOf(1), pager.getCount());\r
+\r
+ pager = taxonService.findByFullText(Taxon.class, "subalpina", null, null, true, null, null, null, null); // --> 0\r
+ Assert.assertEquals("Expecting 0 entities", Integer.valueOf(0), pager.getCount());\r
+\r
+ // synonym in classification ???\r
+ }\r
+\r
/**\r
*\r
*/\r