Передайте поисковый запрос conan в Nexus Elastic Search - PullRequest
0 голосов
/ 25 апреля 2019

Я реализую функцию поиска в 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 на основе имени пакета, группы, версии, формата и т. Д.

...