一.逻辑
1.设置高亮的配置:
(1)设置高亮显示的字段
(2)设置高亮显示的前缀
(3)设置高亮显示的后缀
2.在client对象执行查询之前,设置高亮显示的信息【通知】。
3.遍历结果列表时可以从结果中取高亮结果。
二.代码块
package cn.demo04;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.net.InetAddress;
import java.util.Iterator;
import java.util.Map;
public class StringHighLine {
@Test
/*
根据分页设置进行查询
*/
public void testStringHighLine()throws Exception{
// 1创建一个Settings对象,相当于一个配置信息。主要配置集群名称。
Settings settings = Settings.builder()
//put参数1是配置名称,参数2是配置值
.put("cluster.name","my-elasticsearch")
.build();
// 2创建一个客户端Client对象。
TransportClient client = new PreBuiltTransportClient(settings);
//2.2 获取集群的节点列表
//2.2.1 参数1是InetAddress.getByName获取ip地址(PPT方式),参数二是端口号(节点对外的端口),而不是服务端口号
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9302));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9303));
// 3.创建一个查询对象,可以使用QueryBuilders工具类创建QueryBuilder对象。
QueryBuilder queryBuilder = QueryBuilders
.queryStringQuery("文档对象2")//根据字符串进行创建QueryBuilder对象
.defaultField("title");//设置默认搜索域【field】
// 4.使用client执行查询。
//4.1创建一个HighlightBuilder
HighlightBuilder highlightBuilder = new HighlightBuilder();
//设置高亮的前缀,域,后缀
highlightBuilder.field("title");//域【field】
highlightBuilder.preTags("<em>");//前缀
highlightBuilder.postTags("</em>");//后缀
//4.2添加一个高亮设置
SearchResponse searchResponse = client.prepareSearch("index_hello")//查询的索引库
.setTypes("article")//查询的type
.setQuery(queryBuilder)//查询条件
.setFrom(0)//设置起始页
.setSize(5)//设置每页显示的记录数
.highlighter(highlightBuilder)//设置关键词高亮
.get();//执行查询
// 5.得到查询的结果集。
SearchHits hits = searchResponse.getHits();
// 6.取查询结果的总记录。
System.out.println("查询结果的总记录:" + hits.getTotalHits());
// 7.取查询结果列表。
//7.1获取查询结果的迭代器
Iterator<SearchHit> iterator = hits.iterator();
//7.2遍历迭代器
while(iterator.hasNext()){
SearchHit searchHit = iterator.next();
System.out.println("------------获取字符串形式的文档对象数据---------");
System.out.println("查询的结果为:" + searchHit.getSourceAsString());
System.out.println("--------获取文档的属性---------");
Map<String, Object> document = searchHit.getSource();//获取map集合
System.out.println(document.get("id"));
System.out.println(document.get("title"));
System.out.println(document.get("context"));
//获取高亮的结果集合
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
System.out.println(highlightFields);
HighlightField field = highlightFields.get("title");//通过键名取出高亮的值,键为指的域名【field】
Text[] fragments = field.getFragments();//返回的高亮结果集是数组,需要进行遍历
if(fragments != null){
String fragment = fragments[0].toString();
System.out.println("高亮部分的键为title,值为" + fragment);
}
}
// 8.关闭client对象。
client.close();
}
}
三.范例