FullTextDocument
is used in Elasticsearch mapping
*/
@Document(indexName = "fulltext", refreshInterval = "60s")
public class FullTextDocument {
- // FIXME Revisit!
- private static final String ENGLISH_LOCALE = "en";
-
@Id
private Long id;
@@ -61,6 +53,10 @@ public class FullTextDocument {
@Field(index = FieldIndex.not_analyzed, type = FieldType.Date)
private Date lastModifiedDate;
+ /** The score here will boost result relevance */
+ @Field(index = FieldIndex.not_analyzed)
+ private float score = 0.5f;
+
public Long getId() {
return this.id;
}
@@ -101,21 +97,6 @@ public class FullTextDocument {
this.summary = summary;
}
- public String getTextByLocale(final Locale locale) {
- try {
- final JsonObject json = JsonObject.readFrom(this.body);
- JsonValue value = json.get(locale.getLanguage());
- if (value == null) {
- value = json.get(ENGLISH_LOCALE);
- }
-
- return value.toString().replace("\"", "");
- } catch (final ParseException ignored) {
- }
-
- return getBody();
- }
-
public String getLanguage() {
return this.language;
}
@@ -139,4 +120,12 @@ public class FullTextDocument {
public void setLastModifiedDate(final Date lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
+
+ public float getScore() {
+ return score;
+ }
+
+ public void setScore(float score) {
+ this.score = score;
+ }
}
diff --git a/src/main/java/org/genesys2/server/service/ContentService.java b/src/main/java/org/genesys2/server/service/ContentService.java
index 06c500c021263d0503f9cef32f3903c4a9c3a245..52219ad18ad44bac9a34122af84ab188b5f0bac7 100644
--- a/src/main/java/org/genesys2/server/service/ContentService.java
+++ b/src/main/java/org/genesys2/server/service/ContentService.java
@@ -40,6 +40,8 @@ public interface ContentService {
ClassPK getClassPk(String shortName);
+ ClassPK getClassPk(Class> clazz);
+
/**
* Load article with {@link ClassPK} of clazz with specified id and the
* "slug" for the locale
diff --git a/src/main/java/org/genesys2/server/service/FullTextSearchService.java b/src/main/java/org/genesys2/server/service/FullTextSearchService.java
index d87ed034e97c8f0b86b6e56d50bdae5e62274424..d4178e237a161564258a5481b17e166ab613cc57 100644
--- a/src/main/java/org/genesys2/server/service/FullTextSearchService.java
+++ b/src/main/java/org/genesys2/server/service/FullTextSearchService.java
@@ -43,4 +43,6 @@ public interface FullTextSearchService {
void reindex(String type);
void deleteIndex(String indexName);
+
+ Page> search(String query, Pageable pageable, Class> type) throws SearchException;
}
diff --git a/src/main/java/org/genesys2/server/service/impl/ContentServiceImpl.java b/src/main/java/org/genesys2/server/service/impl/ContentServiceImpl.java
index b1431dbc93f28ac8994d40ddd1c56453ed318772..0cd8ae962eaee7d2d9133820b03a94278ca38310 100644
--- a/src/main/java/org/genesys2/server/service/impl/ContentServiceImpl.java
+++ b/src/main/java/org/genesys2/server/service/impl/ContentServiceImpl.java
@@ -247,6 +247,7 @@ public class ContentServiceImpl implements ContentService {
return article;
}
+ @Override
public ClassPK getClassPk(Class> clazz) {
return classPkRepository.findByClassName(clazz.getName());
}
diff --git a/src/main/java/org/genesys2/server/service/impl/FullTextSearchServiceImpl.java b/src/main/java/org/genesys2/server/service/impl/FullTextSearchServiceImpl.java
index 0c58d9f92ec14abb4ae58dcc2593255097c465ac..494c2a1070d623badc52b131545a5af4db02bcb7 100644
--- a/src/main/java/org/genesys2/server/service/impl/FullTextSearchServiceImpl.java
+++ b/src/main/java/org/genesys2/server/service/impl/FullTextSearchServiceImpl.java
@@ -16,8 +16,10 @@
package org.genesys2.server.service.impl;
import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
+import static org.elasticsearch.index.query.QueryBuilders.functionScoreQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
import static org.elasticsearch.index.query.QueryBuilders.queryString;
+import static org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders.fieldValueFactorFunction;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -40,10 +42,10 @@ import org.elasticsearch.cluster.metadata.AliasMetaData;
import org.elasticsearch.common.collect.ImmutableOpenMap;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.genesys2.server.model.BusinessModel;
-import org.genesys2.server.model.elastic.AccessionDetails;
import org.genesys2.server.model.elastic.FullTextDocument;
import org.genesys2.server.model.impl.ActivityPost;
import org.genesys2.server.model.impl.Article;
+import org.genesys2.server.model.impl.ClassPK;
import org.genesys2.server.model.impl.Country;
import org.genesys2.server.model.impl.FaoInstitute;
import org.genesys2.server.persistence.domain.ActivityPostRepository;
@@ -59,9 +61,11 @@ import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.ElasticsearchException;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
+import org.springframework.data.elasticsearch.core.FacetedPage;
import org.springframework.data.elasticsearch.core.query.AliasQuery;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
@@ -69,6 +73,7 @@ import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import com.hazelcast.core.ILock;
@@ -82,7 +87,7 @@ public class FullTextSearchServiceImpl implements FullTextSearchService, Initial
private static final String INDEXALIAS_FULLTEXT_READ = "fulltextRead";
private static final String INDEXALIAS_FULLTEXT_WRITE = "fulltextWrite";
- private static final String ACCESSION_SECTION = "Accession";
+ private static final String ACCESSION_SECTION = "accession";
private static final String CLASSPK_SHORTNAME = "classPK.shortName";
private static final String REINDEX_TYPE_ALL = "All";
@@ -151,19 +156,68 @@ public class FullTextSearchServiceImpl implements FullTextSearchService, Initial
}
}
+ @Override
+ @Transactional(readOnly = true)
+ public Page> search(final String query, final Pageable pageable, final Class> clazz) throws SearchException {
+ ClassPK classPK = contentService.getClassPk(clazz);
+ if (classPK == null) {
+ throw new SearchException("No such fulltext type");
+ }
+
+ SearchQuery searchQuery = new NativeSearchQueryBuilder()
+ .withIndices(INDEXALIAS_FULLTEXT_READ)
+ .withQuery(
+ functionScoreQuery(
+ boolQuery().must(matchQuery(CLASSPK_SHORTNAME, classPK.getShortName())).must(
+ queryString(query).defaultOperator(QueryStringQueryBuilder.Operator.AND))).add(
+ fieldValueFactorFunction("score").factor(1.0f))).withPageable(pageable).build();
+
+ try {
+ FacetedPage