ElasticSearch 实战:Spring Data ElasticSearch 的使用 NativeSearchQuery 高亮查询

在 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),可能需要通过 SearchHitgetHighlightFields() 方法获取高亮内容:

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 版本间的差异,以正确访问高亮内容。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值