ElasticSearch7.9.3集成Springboot 高亮查询

该代码示例展示了如何在Java中使用ElasticsearchRestTemplate进行全文搜索操作,通过matchQuery匹配关键词,并实现搜索结果的高亮显示。在搜索结果中,可以看到高亮的关键词部分被标记为红色。此外,还提供了分页功能,每页显示10条记录。
摘要由CSDN通过智能技术生成

直接上代码

package cn.itcast.haoke.dubbo.api.service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.codec.binary.StringUtils;
import org.elasticsearch.index.query.Operator;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;

import cn.itcast.haoke.dubbo.api.vo.HouseData;
import cn.itcast.haoke.dubbo.api.vo.SearchResult;

@Service
public class SearchService {
	@Autowired
	private ElasticsearchRestTemplate elasticsearchTemplate;
	public static final Integer ROWS = 10;

	public SearchResult search(String keyWord, Integer page) {
		List<HouseData> houseList = new ArrayList();
		Pageable pageable = PageRequest.of(page - 1, ROWS); // 设置分页参数
		NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
				.withQuery(QueryBuilders.matchQuery("title", keyWord).operator(Operator.AND)) // match查询
				.withPageable(pageable).withHighlightBuilder(getHighlightBuilder("title")) // 设置高亮
				.build();
		SearchHits<HouseData> searchHits = this.elasticsearchTemplate.search(searchQuery, HouseData.class);
		// List<SearchHit<HouseData>> list = housePage.getSearchHits();
		for (SearchHit<HouseData> searchHit : searchHits) { // 获取搜索到的数据

			HouseData content = (HouseData) searchHit.getContent();
			HouseData houseData = new HouseData();
			BeanUtils.copyProperties(content, houseData);

			// 处理高亮
			Map<String, List<String>> highlightFields = searchHit.getHighlightFields();
			for (Entry<String, List<String>> stringHighlightFieldEntry : highlightFields.entrySet()) {
				String key = stringHighlightFieldEntry.getKey();
				if (StringUtils.equals(key, "title")) {
					List<String> fragments = stringHighlightFieldEntry.getValue();
					StringBuilder sb = new StringBuilder();
					for (String fragment : fragments) {
						sb.append(fragment.toString());
					}
					houseData.setTitle(sb.toString());
				}

			}
			houseList.add(houseData);
		}

		return new SearchResult(((Long) (searchHits.getTotalHits())).intValue(), houseList);
	}

	// 设置高亮字段
	private HighlightBuilder getHighlightBuilder(String... fields) {
		// 高亮条件
		HighlightBuilder highlightBuilder = new HighlightBuilder(); // 生成高亮查询器
		for (String field : fields) {
			highlightBuilder.field(field);// 高亮查询字段
		}
		highlightBuilder.requireFieldMatch(false); // 如果要多个字段高亮,这项要为false
		highlightBuilder.preTags("<span style=\"color:red\">"); // 高亮设置
		highlightBuilder.postTags("</span>");
		// 下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等
		highlightBuilder.fragmentSize(800000); // 最大高亮分片数
		highlightBuilder.numOfFragments(0); // 从第一个分片获取高亮片段

		return highlightBuilder;
	}

}

运行:
在这里插入图片描述
测试结果:

{
totalPage: 4
list: [4]
0:  {
id: "8LwCJ3YBLbVdbvP6qrmw"
title: "整租·<span style="color:red">绿地</span>诺丁山(公寓) 1室1厅 南"
rent: "4500"
floor: "中楼层/11层"
image: "SH2042737281873485824.jpg"
orientation: "55㎡"
houseType: "房屋类型:1室1厅1卫"
rentMethod: "租赁方式:整租"
time: null
}-
1:  {
id: "tLwCJ3YBLbVdbvP6qrmv"
title: "整租·<span style="color:red">绿地</span>香颂(奉贤)(别墅) 4室2厅 南"
rent: "7000"
floor: "低楼层/3层"
image: "SH2136087392656818176.jpg"
orientation: "219㎡"
houseType: "房屋类型:4室2厅3卫"
rentMethod: "租赁方式:整租"
time: null
}-
2:  {
id: "2LwCJ3YBLbVdbvP6qrmv"
title: "整租·<span style="color:red">绿地</span>香颂(奉贤)(别墅) 4室2厅 南"
rent: "3000"
floor: "低楼层/3层"
image: "SH2280901565906952192.jpg"
orientation: "219㎡"
houseType: "房屋类型:4室2厅3卫"
rentMethod: "租赁方式:整租"
time: null
}-
3:  {
id: "vrwCJ3YBLbVdbvP6qrmv"
title: "整租·<span style="color:red">绿地</span>海珀佘山 4室3厅 南/北"
rent: "10000"
floor: "低楼层/2层"
image: "SH2132634396648275968.jpg"
orientation: "380㎡"
houseType: "房屋类型:4室3厅2卫"
rentMethod: "租赁方式:整租"
time: null
}-
-
}

页面修改 添加dangerouslySetInnerHTML :
原来:<Item.Header>

{item.title}
</Item.Header>
改成后:
<Item.Header>
</Item.Header>

显示效果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch 7.9中,创建索引是一个基本操作,用于存储和检索数据。以下是创建索引的步骤: 1. **打开Elasticsearch客户端**:你可以使用curl命令行工具,Elasticsearch REST API客户端(如Sense或Beats中的Kibana Dev Tools),或者ElasticsearchJava、Python等官方客户端库。 2. **定义索引信息**:首先,你需要指定索引的名字。例如,如果你想创建一个名为`my-index`的索引,可以这样表示: ```json { "index": { "name": "my-index" } } ``` 3. **发送请求**:将这个JSON结构作为POST请求发送到`/_create`端点。完整的URL可能是`http://localhost:9200/my-index/_create`,其中`localhost:9200`是Elasticsearch的默认地址,需要根据实际情况替换。 示例用curl命令: ```sh curl -X POST 'http://localhost:9200/my-index/_create' -H 'Content-Type: application/json' -d ' { "index": { "name": "my-index" } } ' ``` 4. **检查响应**:如果索引创建成功,Elasticsearch会返回一个响应确认索引已创建。如果索引已经存在,或者创建过程中出现错误,响应会包含相应的错误信息。 5. **配置索引模板**(可选):为了更高效地管理索引,可以预先定义索引模板,设置字段映射、分析器等属性。 6. **将文档插入索引**:创建索引后,你可以开始将文档(通常是JSON格式)插入到索引中。 注意:在实际使用中,可能还需要设置一些选项,比如分片和副本数,以提高查询性能和容错性。具体配置应根据应用需求调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值