NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (searchBean.getSearchKey() != null && !"".equals(searchBean.getSearchKey())) {
if (searchBean.getBoolMatchFlag()) {
String newKey = searchBean.getSearchKey().replace(",", " ");
MatchQueryBuilder boolMatch = QueryBuilders.matchQuery("all", newKey).operator(Operator.OR);
boolQueryBuilder.filter(boolMatch);
} else if (searchBean.getTermsSearchFlag()) {
TermQueryBuilder term = QueryBuilders.termQuery("all", searchBean.getSearchKey());
boolQueryBuilder.filter(term);
} else {
boolQueryBuilder.filter(QueryBuilders.matchAllQuery());
}
}
if (searchBean.getReleaseUserName() != null && !"".equals(searchBean.getReleaseUserName())) {
boolQueryBuilder.filter(QueryBuilders.termQuery("user_name",searchBean.getReleaseUserName()));
}
if (searchBean.getReleaseTimeStart() != null && !"".equals(searchBean.getReleaseTimeStart())
&& searchBean.getReleaseTimeEnd() != null && !"".equals(searchBean.getReleaseTimeEnd()) ) {
try {
boolQueryBuilder.filter(QueryBuilders.rangeQuery("create_time")
.lte(simpleDateFormat.parse(searchBean.getReleaseTimeEnd()))
.gte(simpleDateFormat.parse(searchBean.getReleaseTimeStart()))
);
} catch (ParseException e) {
e.printStackTrace();
}
}
if (searchBean.getFrom() != null && searchBean.getSize() != null) {
searchQueryBuilder.withPageable(PageRequest.of(searchBean.getFrom(), searchBean.getSize()));
} else {
searchQueryBuilder.withPageable(PageRequest.of(1, 10));
}
if (searchBean.getResourceType() != null && !"".equals(searchBean.getResourceType())) {
boolQueryBuilder.filter(QueryBuilders.termQuery("type", searchBean.getResourceType()));
}
NativeSearchQuery searchQuery = searchQueryBuilder.withQuery(boolQueryBuilder)
.withHighlightBuilder(new HighlightBuilder().field("all").preTags("<font color='red'>").postTags("</font>"))
.build();
SearchHits<ExternalResourceDoc> search = elasticsearchRestTemplate.search(searchQuery, ExternalResourceDoc.class);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("total", search.getTotalHits());
List<ExternalResourceDoc> resultList = new ArrayList<>();
** List<SearchHit<ExternalResourceDoc>> searchHits = search.getSearchHits();**
System.out.println(searchHits);
** for (SearchHit<ExternalResourceDoc> searchHit : search.getSearchHits()) {**
ExternalResourceDoc content = searchHit.getContent();
String all = searchHit.getHighlightField("all").get(0);
if (all != null && !"".equals(all)){
System.out.println(all);
}
resultList.add(content);
System.out.println(all);
}
resultMap.put("list", resultList);
return resultMap;
}
源于ChatGPT仅供参考:
根据您提供的代码,可能出现`search.getSearchHits()`返回空列表的原因有以下几种情况:
1. Elasticsearch 中没有匹配查询条件的文档。
可以通过在控制台或者 Kibana 上执行相同的搜索操作来确认是否有符合条件的记录。可以尝试调整查询条件或者放宽限制来获取更多的结果。
2. 查询到的文档中并未包含“all”字段。
在 `HighlightBuilder` 中指定高亮的字段需要与实际索引的字段名一致。如果使用的是其它名称,则需要在对应的字段上添加别名或者修改查询时的字段映射关系。
3. Elasticsearch 的高亮功能未正确配置或启用。
您可以在 Elasticsearch 配置文件中检查 `highlight.enabled` 参数是否为 true。还可以使用 REST API 来验证:
```http
GET /index/_settings?filter_path=*.highlight.enabled
```
如果返回值中,`highlight.enabled` 为 false,则需要将其设置为 true。
4. `search.getSearchHits()` 返回 null 值。
这种情况可能出现在 Elasticsearch 返回的响应或者底层连接出现问题时。您可以通过在 try-catch 语句中处理该异常,并记录日志来排除该问题。
总之,建议对代码进行一些调试,以确定具体是哪种情况导致了搜索结果为空。希望这些信息能够帮到您!