@RestController public class SearchController { @Autowired private ElasticsearchClient elasticSearchClient; @Autowired private SearchQuery searchQuery; // 确保searchQuery已经被正确注入 @PostMapping("") // 将URL路径设置为要调用的网址服务 public <T extends SearchHit> T[] search(@RequestParam Map<String, Object> params) { QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); queryBuilder = QueryBuilders.matchQuery("field_name", "query_text"); SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("cheng_index"); searchRequest.types("my_type"); searchRequest.source(); searchRequest.source(new SearchSourceBuilder().size(10)); // 设置返回结果数量 SearchResponse searchResponse = elasticSearchClient.search(searchRequest, RequestOptions.DEFAULT); return (T[])searchResponse.getHits().getHits(); // 将返回类型转换为泛型类型T的数组 } }
时间: 2024-03-13 20:43:09 浏览: 23
在你的代码中,有几个问题需要解决:
1. `SearchQuery` 类需要传递一个 `NativeSearchQueryBuilder` 对象来构建查询。因此,你需要将 `QueryBuilder` 对象放到 `NativeSearchQueryBuilder` 中,然后再将其传递给 `SearchQuery`。
2. `SearchRequest` 的 `source` 方法需要传递一个 `SearchSourceBuilder` 对象来设置查询参数。你需要使用以下代码替换你的 `searchRequest.source();`:
```
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
sourceBuilder.size(10);
searchRequest.source(sourceBuilder);
```
3. 在你的 `search` 方法中,你需要将返回结果转换为 `T[]` 类型的数组。建议你使用 `List<T>` 类型来存储结果,然后将其转换为 `T[]`。
根据以上修改,你的代码应该如下所示:
```
@RestController
public class SearchController {
@Autowired
private ElasticsearchClient elasticSearchClient;
@PostMapping("")
public <T extends SearchHit> T[] search(@RequestParam Map<String, Object> params) {
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
queryBuilder = QueryBuilders.matchQuery("field_name", "query_text");
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withQuery(queryBuilder);
searchQueryBuilder.withIndices("cheng_index");
searchQueryBuilder.withTypes("my_type");
searchQueryBuilder.withPageable(PageRequest.of(0, 10));
SearchQuery searchQuery = searchQueryBuilder.build();
SearchResponse searchResponse = elasticSearchClient.search(searchQuery, RequestOptions.DEFAULT);
List<T> hits = Arrays.stream(searchResponse.getHits().getHits())
.map(hit -> (T)hit)
.collect(Collectors.toList());
return hits.toArray((T[]) Array.newInstance(hits.get(0).getClass(), hits.size()));
}
}
```
希望这可以帮助你解决问题。