在 Spring Data Elasticsearch 中,使用 NativeSearchQuery
可以实现更为灵活和复杂的查询,包括高亮(highlighting)功能。以下是一个使用 NativeSearchQuery
进行高亮查询的实战示例:
1. 准备实体类
假设您已经有一个使用 Spring Data Elasticsearch 注解的实体类,如 Book
:
@Document(indexName = "book", type = "_doc")
public class Book {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "standard", searchAnalyzer = "standard")
private String title;
// 其他字段、构造函数、getter/setter...
}
2. 定义高亮字段
为了使某个字段支持高亮,需要在实体类中添加 @Highlighted
注解。例如,为 title
字段添加高亮支持:
@Document(indexName = "book", type = "_doc")
public class Book {
// ...
@Field(type = FieldType.Text, analyzer = "standard", searchAnalyzer = "standard")
@Highlighted
private String title;
// ...
}
3. 创建 NativeSearchQuery
在需要执行高亮查询的地方,创建一个 NativeSearchQuery
对象,并设置查询条件和高亮参数:
@Autowired
private ElasticsearchOperations operations;
public List<Book> searchWithHighlight(String keyword) {
HighlightBuilder highlightBuilder = new HighlightBuilder()
.field(new Field("title")) // 设置要高亮的字段
.preTags("<em>") // 设置高亮前缀标签
.postTags("</em>"); // 设置高亮后缀标签
NativeSearchQuery query = new NativeSearchQuery(
QueryBuilders.multiMatchQuery(keyword, "title") // 设置查询条件
);
query.addHighlightedFields(highlightBuilder); // 添加高亮参数到查询对象
// 执行查询并返回结果
return operations.search(query, Book.class).getSearchHits().stream()
.map(SearchHit::getContent)
.collect(Collectors.toList());
}
4. 处理高亮结果
查询结果中的每个 Book
实例将包含高亮后的 title
字段。访问高亮内容的方法取决于 Spring Data Elasticsearch 的版本。对于较新版本(如 4.x),可以直接通过 Book
实例的 getHighlightedFields()
方法获取高亮内容,然后遍历高亮字段并提取高亮文本:
List<Book> highlightedResults = searchWithHighlight("example keyword");
for (Book book : highlightedResults) {
Map<String, List<String>> highlightedFields = book.getHighlightedFields();
if (highlightedFields.containsKey("title")) {
List<String> titleHighlights = highlightedFields.get("title");
String highlightedTitle = titleHighlights.isEmpty() ? book.getTitle() : titleHighlights.get(0);
System.out.println("Highlighted Title: " + highlightedTitle);
}
}
对于旧版本(如 3.x),可能需要通过 SearchHit
的 getHighlightFields()
方法获取高亮内容:
List<Book> searchResults = searchWithHighlight("example keyword");
for (SearchHit<Book> hit : searchResults) {
Map<String, List<String>> highlights = hit.getHighlightFields();
if (highlights.containsKey("title")) {
List<String> titleHighlights = highlights.get("title");
String highlightedTitle = titleHighlights.isEmpty() ? hit.getContent().getTitle() : titleHighlights.get(0);
System.out.println("Highlighted Title: " + highlightedTitle);
}
}
通过以上步骤,您已经成功使用 Spring Data Elasticsearch 的 NativeSearchQuery
实现了高亮查询。根据实际需求,您可以进一步调整高亮参数(如设置高亮标签、片段大小等),或者为其他字段添加高亮支持。同时,注意处理不同 Spring Data Elasticsearch 版本间的差异,以正确访问高亮内容。