现在的位置: 首页 > 综合 > 正文

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

2013年10月27日 ⁄ 综合 ⁄ 共 1397字 ⁄ 字号 评论关闭

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

【上篇】
【下篇】

抱歉!评论已关闭.