1

次のリクエストを生成する Spring Data Solr を使用して、Solr クエリに追加のパラメーターを追加することは可能ですか?

"params": {
  "indent": "true",
  "q": "*.*",
  "_": "1430295713114",
  "wt": "java",
  "AuthenticatedUserName": "user@domain.com"
}

Apache Manifoldcf で必要なパラメーター、AuthenticatedUserName とその値を、Spring Data Solr (q、wt) によって自動的に入力される他のパラメーターと一緒に追加したいと考えています。

ありがとう、V.

4

1 に答える 1

1

SolrTemplate クラスのソース コードを確認することでなんとか機能させることができましたが、より邪魔にならない解決策があるかどうか疑問に思っていました。

public Page<Document> searchDocuments(DocumentSearchCriteria criteria, Pageable page) {
    String[] words = criteria.getTitle().split(" ");
    Criteria conditions = createSearchConditions(words);
    SimpleQuery query = new SimpleQuery(conditions);
    query.setPageRequest(page);
    SolrQuery solrQuery = queryParsers.getForClass(query.getClass()).constructSolrQuery(query);
    solrQuery.add(AUTHENTICATED_USER_NAME, criteria.getLoggedUsername());
    try {
        String queryString = this.queryParsers.getForClass(query.getClass()).getQueryString(query);
        solrQuery.set(CommonParams.Q, queryString);
        QueryResponse response = solrTemplate.getSolrServer().query(solrQuery);

        List<Document> beans = convertQueryResponseToBeans(response, Document.class);
        SolrDocumentList results = response.getResults();

        return new SolrResultPage<>(beans, query.getPageRequest(), results.getNumFound(), results.getMaxScore());
    } catch (SolrServerException e) {
        log.error(e.getMessage(), e);
        return new SolrResultPage<>(Collections.<Document>emptyList());
    }
}

private  <T> List<T> convertQueryResponseToBeans(QueryResponse response, Class<T> targetClass) {
    return response != null ? convertSolrDocumentListToBeans(response.getResults(), targetClass) : Collections
            .<T> emptyList();
}

public <T> List<T> convertSolrDocumentListToBeans(SolrDocumentList documents, Class<T> targetClass) {
    if (documents == null) {
        return Collections.emptyList();
    }
    return solrTemplate.getConverter().read(documents, targetClass);
}

private Criteria createSearchConditions(String[] words) {
    return new Criteria("title").contains(words)
            .or(new Criteria("description").contains(words))
                    .or(new Criteria("content").contains(words))
                    .or(new Criteria("resourcename").contains(words));
}
于 2015-04-30T07:49:54.700 に答える