前面提到如何进行搜索,并将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()取得结果中进行了高亮标识的域名-域值对,然后对这些域名-域值对进行分析得到高亮的域结果。