SpringBoot + Elasticsearch7.5 實現同時多個索引的搜索

由於從Spring Data Elasticsearch中Repository繼承的接口無法實現多個索引的搜索,因此直接使用Elasticsearch客戶端High Level REST Client來實現多個索引的搜索。

當然您也可以使用ElasticsearchRestTemplate中的multiSearch來實現多重條件搜索,multiSearch返回的結果是SearchHits的列表。

具體的實現代碼如下:

<code>@Service
public class EsSearchServiceImpl implements IEsSearchService {
\t
\t@Autowired
\tprivate RestHighLevelClient client;

\t@Override
\tpublic List<searchresult> search(String keyword, int page, int size) {
\t\t// 構造分頁類
\t Pageable pageable = PageRequest.of(page, size);
\t SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
\t\t// 構造查詢 NativeSearchQueryBuilder
\t NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder()
\t \t\t.withPageable(pageable);
\t if (!StringUtils.isEmpty(keyword)) {
\t \tsearchQueryBuilder.withQuery(QueryBuilders.queryStringQuery(keyword));
\t }
\t NativeSearchQuery searchQuery = searchQueryBuilder.build();
\t
\t\tSearchRequest searchRequest = new SearchRequest();
\t\t//指定多個索引名稱
\t\tsearchRequest.indices("index-student", "index-teacher");
\t\tQueryBuilder elasticsearchQuery = searchQuery.getQuery();
\t\tsearchSourceBuilder.query(elasticsearchQuery);
\t\tsearchRequest.source(searchSourceBuilder);
\t\t//返回結果
\t\tList<searchresult> resultList = new ArrayList<>();
\t\t
\t\tSearchResponse response = null;
\t\ttry {
\t\t\tresponse = client.search(searchRequest, RequestOptions.DEFAULT);
\t\t} catch (IOException e) {
\t\t\te.printStackTrace();
\t\t}
\t\t
\t\tif (response != null) {
\t\t\tSearchDocumentResponse documentResponse = SearchDocumentResponse.from(response);
\t\t\tList<searchdocument> docList = documentResponse.getSearchDocuments();
\t\t\tfor (SearchDocument doc : docList) {
\t\t\t\tString json = doc.toJson();
\t\t\t\tif (json.indexOf(Student.class.getName()) >= 0) {
\t\t\t\t\tJSONObject jsonObject = JSONObject.parseObject(json);
\t\t\t\t\tStudent student = JSONObject.toJavaObject(jsonObject, Student.class);
\t\t\t\t\tSearchResult result = new SearchResult();
\t\t\t\t\tresult.setType("student");
\t\t\t\t\tresult.setStudent(student);
\t\t\t\t\tresultList.add(result);
\t\t\t\t} else if (json.indexOf(Teacher.class.getName()) >= 0) {
\t\t\t\t\tJSONObject jsonObject = JSONObject.parseObject(json);
\t\t\t\t\tTeacher teacher = JSONObject.toJavaObject(jsonObject, Teacher.class);
\t\t\t\t\tSearchResult result = new SearchResult();
\t\t\t\t\tresult.setType("teacher");
\t\t\t\t\tresult.setTeacher(teacher);
\t\t\t\t\tresultList.add(result);
\t\t\t\t}
\t\t\t}
\t\t}
\t\treturn resultList;
\t}
}/<searchdocument>/<searchresult>/<searchresult>/<code>

由於代碼複製上來,有時格式會比較難看,附上截屏如下:

SpringBoot + Elasticsearch7.5 實現同時多個索引的搜索


SpringBoot + Elasticsearch7.5 實現同時多個索引的搜索


分享到:


相關文章: