elasticsearch 高亮搜索字段


elasticsearch 高亮搜索字段

 

 

********************

相关类与接口

 

HighlightBuilder:高亮构造器

public class HighlightBuilder extends AbstractHighlighterBuilder<HighlightBuilder> {

*********
构造方法

    public HighlightBuilder() {
    public HighlightBuilder(HighlightBuilder template, QueryBuilder highlightQuery, List<HighlightBuilder.Field> fields) {
    public HighlightBuilder(StreamInput in) throws IOException {


*********
常用方法

    public HighlightBuilder field(String name) {
    public HighlightBuilder field(String name, int fragmentSize) {
    public HighlightBuilder field(String name, int fragmentSize, int numberOfFragments) {
    public HighlightBuilder field(String name, int fragmentSize, int numberOfFragments, int fragmentOffset) {
    public HighlightBuilder field(HighlightBuilder.Field field) {

    void fields(List<HighlightBuilder.Field> fields) {
    public List<HighlightBuilder.Field> fields() {

 

AbstractHighlighterBuilder

public abstract class AbstractHighlighterBuilder<HB extends AbstractHighlighterBuilder<?>> implements Writeable, Rewriteable<HB>, ToXContentObject {

*********
常用方法

    public HB preTags(String... preTags) { //设置前缀
    public String[] preTags() {

    public HB postTags(String... postTags) { //设置后缀
    public String[] postTags() {

 

ElasticsearchRestTemplate:操作类

public class ElasticsearchRestTemplate extends AbstractElasticsearchTemplate implements ElasticsearchOperations, EsClient<RestHighLevelClient>, ApplicationContextAware {

    public <T> AggregatedPage<T> queryForPage(SearchQuery query, Class<T> clazz, SearchResultMapper mapper) {

 

 

SearchResultMapper:搜索结果映射类

public interface SearchResultMapper {
    <T> AggregatedPage<T> mapResults(SearchResponse var1, Class<T> var2, Pageable var3);

    @Nullable
    <T> T mapSearchHit(SearchHit var1, Class<T> var2);
}

 

SearchResponse

public class SearchResponse extends ActionResponse implements StatusToXContentObject {

    public SearchHits getHits() {

 

SearchHit

public final class SearchHit implements Streamable, ToXContentObject, Iterable<DocumentField> {

    public Map<String, HighlightField> getHighlightFields() {
 

 

HightField

public class HighlightField implements ToXContentFragment, Streamable {

    public Text[] fragments() {
    public Text[] getFragments() {

 

Text

public final class Text implements Comparable<Text>, ToXContentFragment {

    public String string() {
    public String toString() {

 

 

********************

示例

 

****************

conroller 层

 

@RestController
public class PersonController {

    @Resource
    private PersonRepository personRepository;

    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @RequestMapping("/save")
    public String save(){
        for (int i=0;i<100;i++){
            Person person=new Person();
            person.setId(i);
            person.setName("瓜田李下 "+i);
            person.setAge(i/10+10);

            personRepository.save(person);
        }

        return "success";
    }

    @RequestMapping("/highlight")
    @SuppressWarnings("unchecked")
    public List<Person> highlight(){
        QueryBuilder queryBuilder=QueryBuilders.regexpQuery("name","瓜田李下 1.");
        HighlightBuilder highlightBuilder=new HighlightBuilder().field("name")
                .preTags("<span style='color:red'>").postTags("</span>")
                .requireFieldMatch(false);

        NativeSearchQuery nativeSearchQuery=new NativeSearchQueryBuilder()
                .withQuery(queryBuilder)
                .withHighlightBuilder(highlightBuilder).build();

        AggregatedPage<Person> aggregatedPage=elasticsearchRestTemplate.queryForPage(nativeSearchQuery,
                Person.class, new SearchResultMapper() {
                    @Override
                    public <T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable) {
                        List<Person> list=new ArrayList<>();

                        SearchHits searchHits=searchResponse.getHits();
                        if (searchHits.getHits().length!=0){
                            for (SearchHit searchHit:searchHits){
                                Person person=new Person();

                                Map<String,Object> map=searchHit.getSourceAsMap();
                                person.setId(Integer.parseInt(map.get("id").toString()));
                                person.setAge(Integer.parseInt(map.get("age").toString()));

                                HighlightField nameField=searchHit.getHighlightFields().get("name");
                                if (nameField!=null){
                                    person.setName(nameField.getFragments()[0].toString());
                                }else {
                                    person.setName(map.get("name").toString());
                                }

                                list.add(person);
                            }
                        }

                        if (list.size()!=0){
                            return new AggregatedPageImpl<>((List<T>)list);
                        }

                        return null;
                    }

                    @Override
                    public <T> T mapSearchHit(SearchHit searchHit, Class<T> aClass) {
                        return null;
                    }
                });

        List<Person> list=aggregatedPage.getContent();
        list.forEach(System.out::println);

        return list;
    }
}

 

 

********************

使用测试

 

/highlight

Person(id=11, name=<span style='color:red'>瓜田李下 11</span>, age=11)
Person(id=13, name=<span style='color:red'>瓜田李下 13</span>, age=11)
Person(id=16, name=<span style='color:red'>瓜田李下 16</span>, age=11)
Person(id=17, name=<span style='color:red'>瓜田李下 17</span>, age=11)
Person(id=19, name=<span style='color:red'>瓜田李下 19</span>, age=11)
Person(id=10, name=<span style='color:red'>瓜田李下 10</span>, age=11)
Person(id=14, name=<span style='color:red'>瓜田李下 14</span>, age=11)
Person(id=12, name=<span style='color:red'>瓜田李下 12</span>, age=11)
Person(id=15, name=<span style='color:red'>瓜田李下 15</span>, age=11)
Person(id=18, name=<span style='color:red'>瓜田李下 18</span>, age=11)

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值