Я реализую функцию поиска в conan для nexus-conan-repository:
https://github.com/sonatype-nexus-community/nexus-repository-conan
У меня реализованы остальные конечные точки API. Остальные API соответствуют следующим запросам:
1. (http://localhost:8081/repository/conan-hosted/v1/conans/zlib/[>1.0<1.8]/conan/stable/search?"})
2. http://localhost:8081/repository/conan-hosted/v1/conans/search?q=zlib"
'1' основано на следующем запросе от клиента conan:
conan search 'zlib/[>1.0<1.8]@conan/stable' -r nxrm-conan-hosted
Для '1' запрос на поиск является полным запросом, и параметры '? Q =' отсутствуют.
Однако для '2' запрос основан на следующем запросе клиента conan:
conan search zlib -r nxrm-conan-hosted
Так что для неполных имен пакетов запросы основаны на? Q.
Основной мозг поиска заключается в следующем:
package org.sonatype.repository.conan.internal.hosted.search;
import org.sonatype.goodies.common.ComponentSupport;
import javax.inject.Named;
import javax.inject.Singleton;
import javax.inject.Inject;
import org.sonatype.nexus.repository.FacetSupport;
import org.sonatype.nexus.repository.view.Context;
import org.sonatype.nexus.repository.view.Parameters;
import org.sonatype.nexus.repository.search.SearchService;
import org.sonatype.nexus.repository.view.Request;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import java.io.IOException;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.util.Collections.singletonList;
@Named
public class ConanSearchFacetHosted extends FacetSupport implements ConanSearchFacet {
private final SearchService nexusSearchService;
@Inject
public ConanSearchFacetHosted(final SearchService nexusSearchService) {
this.nexusSearchService = checkNotNull(nexusSearchService);
}
public void searchRecipes(final Context context, String pattern) throws IOException {
System.out.println("Searching Recipes");
Request request = context.getRequest();
Parameters paramsObj = request.getParameters();
System.out.println("SIZE: " + paramsObj.get("size"));
System.out.println("FROM: " + paramsObj.get("from"));
// int size =
// String queryText = paramsObj.extractText(paramsObj);
QueryStringQueryBuilder query = QueryBuilders.queryStringQuery(pattern)
.allowLeadingWildcard(true)
.analyzeWildcard(true);
SearchResponse searchResponse = nexusSearchService.searchUnrestrictedInRepos(query,
null,
1,
19,
singletonList(getRepository().getName()));
// System.out.println("Query Text: " + queryText);
}
public static void searchPackages() {
System.out.println("Search Packages");
}
}
Для запроса типа 1 мы хотим предоставить всю информацию о пакете, такую как:
Existing packages for recipe zlib/1.2.11@conan/stable:
Package_ID: 51b39bbf59d48fe09b7ac83ddab65ed9b30af19c
[options]
fPIC: True
minizip: False
shared: True
[settings]
arch: x86_64
build_type: Release
compiler: clang
compiler.version: 6.0
os: Linux
Outdated from recipe: False
Для запросов типа 2, следующий вывод:
Existing package recipes:
zlib/1.2.11@conan/stable
Если я прав, поисковые запросы выполняются с использованием упругого поиска. Конанский веб-клиент может использовать тот же подход. Я думаю, что это можно сделать с помощью:
org.sonatype.nexus.repository.search.SearchService
Этот класс имеет следующие методы для выполнения поисковых запросов:
(https://github.com/sonatype/nexus-public/blob/a4e21c25d7a24c1395c85a745b4318a6edaa7399/components/nexus-repository/src/main/java/org/sonatype/nexus/repository/search/SearchService.java)
SearchResponse searchUnrestricted(QueryBuilder query, @Nullable List<SortBuilder> sort, int from, int size);
/**
* Search component metadata and browse results (paged) with content selectors applied.
*
* @since 3.1
*/
SearchResponse search(QueryBuilder query, @Nullable List<SortBuilder> sort, int from, int size);
/**
* Search component metadata and browse results with content selectors applied.
*
* @since 3.14
*/
Iterable<SearchHit> browse(QueryBuilder query);
/**
* Search component metadata and browse results (paged) in selected repositories
*
* @since 3.14
*/
SearchResponse searchUnrestrictedInRepos(final QueryBuilder query,
@Nullable final List<SortBuilder> sort,
final int from,
final int size,
Collection<String> repoNames);
Если это так для выполнения поисковых запросов, я хотел бы узнать о параметрах, таких как QueryBuilder, и о том, как я могу формировать запросы на основе информации из http-запроса.
Используя объект Context, я могу получить информацию о входящих запросах и предоставленных параметрах.
Пока я не рассматриваю конкретные детали о том, как создать полный ответ для поиска во всех пакетах, а только о том, как использовать SearchService для получения результатов. Например, для запроса SearchService на основе имени пакета, группы, версии, формата и т. Д.