Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例
warning:
这篇文章距离上次修改已过213天,其中的内容可能已经有所变动。
在Spring Boot项目中,使用Spring Data Elasticsearch实现全文检索并支持高亮的示例代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.HighlightQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class SearchService {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
public Page<Item> search(String query, int page, int size) {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder().keyword().field("fieldName").text(query))
.withHighlightFields(
new HighlightBuilder.Field("fieldName").preTags("<em>").postTags("</em>")
)
.withPageable(PageRequest.of(page, size))
.build();
SearchHits<Item> searchHits = elasticsearchTemplate.search(searchQuery, Item.class);
List<Item> content = searchHits.getSearchHits().stream()
.map(searchHit -> {
Item item = searchHit.getContent();
Map<String, List<String>> highlightFields = searchHit.getHighlightFields();
if (highlightFields.containsKey("fieldName")) {
item.setFieldName(highlightFields.get("fieldName").get(0));
}
return item;
})
.toList();
return new PageImpl<>(content, PageRequest.of(page, size), searchHits.getTotalHits());
}
}
class Item {
// 实体类属性和方法
private String fieldName;
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
// 其他属性和方法
}
在这个例子中,我们定义了一个SearchService
服务类,其中的search
方法构建了一个NativeSearchQueryBuilder
来执行基于关键词的搜索,并通过withHighlightFields
启用了字段的高亮。然后,我们使用elasticsearchTemplate.search
方法执行搜索,并处理返回的结果,将高亮的文本设置回实体对象中。
请注意,这个例子假设你已经有了一个Elasticsearch节
评论已关闭