您的位置:首页 > 其它

分布式搜索Elasticsearch——搜索(二)

2013-05-10 00:04 453 查看
前面提到如何进行搜索,并将SearchRequestBuilder的一些方法进行了列举,本文调用了SearchRequestBuilder的用于高亮的方法,处理了检索中的高亮问题:

SearchResponse response1 = client.prepareSearch("user")
.setTypes("tb_person0", "tb_person1", "tb_person2", "tb_person3", "tb_person4")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.fieldQuery("name", "张三"))             // Query
.addHighlightedField("name")
.setHighlighterPreTags("<span style=\"color:red\">")
.setHighlighterPostTags("</span>")
.setFilter(FilterBuilders.rangeFilter("age").from(20).to(22))   // Filter
.setFrom(0).setSize(60).setExplain(true)
.execute()
.actionGet();

SearchHits hits1 = response1.getHits();
for(SearchHit hit : hits1){
String json = hit.getSourceAsString();

Person newPerson = mapper.readValue(json,
Person.class);

Map<String, HighlightField> result = hit.highlightFields();
HighlightField titleField = result.get("name");
Text[] titleTexts =  titleField.fragments();

String name = "";

for(Text text : titleTexts){
name += text;
}
newPerson.setName(name);

System.out.println("name\t\t" + newPerson.getName());
System.out.println("sex\t\t" + newPerson.getSex());
System.out.println("age\t\t" + newPerson.getAge());
System.out.println("isStudent\t\t" + newPerson.getIsStudent());

System.out.println("--------------------------");
}


addHighlightedField(String fieldName)指明要进行高亮处理的Field;setHighlighterPreTags设定了高亮文字的前缀;setHighlighterPostTags设定了高亮文字的后缀。

取得hit后,使用hit.highlightFields()取得结果中进行了高亮标识的域名-域值对,然后对这些域名-域值对进行分析得到高亮的域结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: