This is the codeAbility Sharing Platform! Learn more about the codeAbility Sharing Platform.

Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • development/sharing/codeability-sharing-platform
1 result
Show changes
Commits on Source (2)
......@@ -158,7 +158,7 @@
<dependency>
<groupId>org.codeability.sharing</groupId>
<artifactId>SharingPluginPlatformAPI</artifactId>
<version>0.4.10</version>
<version>0.4.10-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
......
......@@ -7,6 +7,10 @@ import at.ac.uibk.gitsearch.repository.jpa.StatisticsRepository;
import at.ac.uibk.gitsearch.service.dto.AutoCompleteEntry;
import at.ac.uibk.gitsearch.service.dto.StatisticsDTO;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.ScriptSortType;
import co.elastic.clients.elasticsearch._types.SortOptions;
import co.elastic.clients.elasticsearch._types.SortOptionsBuilders;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.ExistsQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.MatchPhrasePrefixQuery;
......@@ -14,7 +18,6 @@ import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.MultiMatchQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.PrefixQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.RangeQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.ScriptScoreQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.TermQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.TextQueryType;
import co.elastic.clients.elasticsearch.core.search.Hit;
......@@ -53,7 +56,6 @@ import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.DoubleStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import javax.annotation.PostConstruct;
......@@ -558,17 +560,20 @@ public class MetaDataRepository {
@SuppressWarnings({ "PMD.ExcessiveMethodLength", "PMD.NcssCount" })
public SearchResultsDTO pageDetailsWithJavaApi(SearchInputDTO searchInputDTO, Optional<User> user, boolean ignoreUserAuthorization)
throws IOException {
BoolQuery.Builder queryBuilder = createQueryBuilder(searchInputDTO, user, ignoreUserAuthorization);
final int pageSize = searchInputDTO.getPageSize();
final int from = (searchInputDTO.getPage()) * pageSize;
try {
final BoolQuery.Builder boolQueryBuilder = createBoolQueryBuilder(searchInputDTO, user, ignoreUserAuthorization);
final ScriptScoreQuery.Builder scoreQueryBuilder = createScoreQueryBuilder(searchInputDTO, boolQueryBuilder.build());
final BoolQuery query = queryBuilder.build();
// LOGGER.info("ElasticSearch Query using Java Client API:\n{}", query)
co.elastic.clients.elasticsearch.core.SearchResponse<SearchResultDTO> searchResponse = elasticsearchAPIClient.search(
search ->
search
.index(SearchRepositoryConstants.INDEX_METADATA)
.query(q -> q.scriptScore(scoreQueryBuilder.build()))
.query(q -> q.bool(query))
.sort(getSortStrategy(searchInputDTO.getOrdering()))
.from(from)
.size(pageSize),
SearchResultDTO.class
......@@ -588,8 +593,7 @@ public class MetaDataRepository {
}
}
private ScriptScoreQuery.Builder createScoreQueryBuilder(SearchInputDTO searchInputDTO, final BoolQuery query) {
final SearchOrdering searchOrdering = searchInputDTO.getOrdering();
private List<SortOptions> getSortStrategy(SearchOrdering searchOrdering) {
String sortingScriptTemplate =
"double boost = 0;" +
"if (doc.containsKey('${badgeRewarded}') && doc['${badgeRewarded}'].size() > 0) {" +
......@@ -601,7 +605,7 @@ public class MetaDataRepository {
"if (doc.containsKey('${views}') && doc['${views}'].size() > 0) {" +
" boost = boost + doc['${views}'].value * params.factorViews;" +
"}" +
"return boost + _score;";
"return boost;";
Map<String, String> templateValueMapping = Map.of(
"badgeRewarded",
......@@ -612,25 +616,23 @@ public class MetaDataRepository {
SearchRepositoryConstants.SEARCHSTATISTICS_VIEWS
);
double maxFactor =
DoubleStream
.of(searchOrdering.getFactorBadge(), searchOrdering.getFactorDownloads(), searchOrdering.getFactorViews())
.max()
.getAsDouble() *
0.2;
return new ScriptScoreQuery.Builder()
.script(sb ->
sb.inline(isb ->
isb
.lang("painless")
.source(StringSubstitutor.replace(sortingScriptTemplate, templateValueMapping))
.params("factorBadge", JsonData.of(searchOrdering.getFactorBadge() / maxFactor))
.params("factorDownloads", JsonData.of(searchOrdering.getFactorDownloads() / maxFactor))
.params("factorViews", JsonData.of(searchOrdering.getFactorViews() / maxFactor))
var scriptSort = SortOptionsBuilders.script(b ->
b
.type(ScriptSortType.Number)
.order(SortOrder.Desc)
.script(sb ->
sb.inline(isb ->
isb
.lang("painless")
.source(StringSubstitutor.replace(sortingScriptTemplate, templateValueMapping))
.params("factorBadge", JsonData.of(searchOrdering.getFactorBadge()))
.params("factorDownloads", JsonData.of(searchOrdering.getFactorDownloads()))
.params("factorViews", JsonData.of(searchOrdering.getFactorViews()))
)
)
)
.query(q -> q.bool(query));
);
return List.of(SortOptionsBuilders.score(s -> s.order(SortOrder.Desc)), scriptSort);
}
/**
......@@ -642,7 +644,7 @@ public class MetaDataRepository {
* @return
*/
@SuppressWarnings("PMD.ExcessiveMethodLength")
private BoolQuery.Builder createBoolQueryBuilder(SearchInputDTO searchInputDTO, Optional<User> user, boolean ignoreUserAuthorization) {
private BoolQuery.Builder createQueryBuilder(SearchInputDTO searchInputDTO, Optional<User> user, boolean ignoreUserAuthorization) {
BoolQuery.Builder queryBuilder = new BoolQuery.Builder();
forEachTerm(
......