Elasticsearch 5.1.1搜索高亮及Java API实现

5.1.1的搜索高亮和2.X有所变化,但是变化不大。下面分四步来介绍:创建索引(设置mapping/IK分词)、索引文档、REST API的搜索高亮、JAVA API的搜索高亮。 
注:从这篇博客开始,采用简写的代码风格,也就是Sence插件或者kibana的dev tools中采用的风格。(温馨提示:安装kibana 5.1.1,在dev tools中直接可以使用简单格式命令。)

一、创建索引

文档结构为blog/article/id。先创建一个空的index:

PUT blog
 
 
  • 1

创建mapping:

POST blog/article/_mapping
{
  "article": {

    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_max_word",
        "boost": 8
      },
      "content": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_max_word",
        "boost": 4
      }
    }
  }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

二、索引测试文档

加入三条文档到blog索引。 
文档1:

POST blog/article/1
{
  "title":"java编程思想",
  "content":"《Java编程思想》这本书赢得了全球程序员的广泛赞誉"
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

文档2:

POST blog/article/2
{
  "title":"手把手教你使用Git",
  "content":"这是一个非常容易上手的GIt详细教程"
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

文档3:

POST blog/article/3
{
  "title":"java从入门到精通",
  "content":"《java从入门到精通》非常适合java初学"
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

三、REST高亮API

我们查询title中含有java的文档,并用自定义高亮片段标记出来。

POST blog/_search
{
  "query": {
    "match": {
      "title": "java"
    }
  },
  "highlight": {
    "fields": {
      "title": {
        "pre_tags": "<strong>",
        "post_tags": "</strong>"
      }
    }
  }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

查询结果:

    "total": 2,
    "max_score": 2.3014567,
    "hits": [
      {
        "_index": "blog",
        "_type": "article",
        "_id": "3",
        "_score": 2.3014567,
        "_source": {
          "title": "java从入门到精通",
          "content": "《java从入门到精通》非常适合java初学"
        },
        "highlight": {
          "title": [
            "<strong>java</strong>从入门到精通"
          ]
        }
      },
      {
        "_index": "blog",
        "_type": "article",
        "_id": "1",
        "_score": 2.025282,
        "_source": {
          "title": "java编程思想",
          "content": "《Java编程思想》这本书赢得了全球程序员的广泛赞誉"
        },
        "highlight": {
          "title": [
            "<strong>java</strong>编程思想"
          ]
        }
      }
    ]
  }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

这里写图片描述

四、搜索高亮的java api实现

jar包导入请参考前面的的一篇博客Elasticsearch 5.X下JAVA API使用指南 
写一个测试类:

package esjavapia5;
import java.net.InetAddress;
import java.net.UnknownHostException;
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.transport.client.PreBuiltTransportClient;
public class Es5Highlight {
    public static void main(String[] args) throws UnknownHostException {
        // TODO Auto-generated method stub
        // 设置集群名称
        Settings settings = Settings.builder()
                .put("cluster.name", "elasticsearch").build();
        // 创建client
        TransportClient client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(
                        InetAddress.getByName("127.0.0.1"), 9300));
        QueryBuilder matchQuery = QueryBuilders.matchQuery("title", "编程");
        HighlightBuilder hiBuilder=new HighlightBuilder();
        hiBuilder.preTags("<h2>");
        hiBuilder.postTags("</h2>");
        hiBuilder.field("title");
        // 搜索数据
        SearchResponse response = client.prepareSearch("blog")
                .setQuery(matchQuery)
                .highlighter(hiBuilder)
                .execute().actionGet();
        //获取查询结果集
        SearchHits searchHits = response.getHits();
        System.out.println("共搜到:"+searchHits.getTotalHits()+"条结果!");
        //遍历结果
        for(SearchHit hit:searchHits){
            System.out.println("String方式打印文档搜索内容:");
            System.out.println(hit.getSourceAsString());
            System.out.println("Map方式打印高亮内容");
            System.out.println(hit.getHighlightFields());

            System.out.println("遍历高亮集合,打印高亮片段:");
            Text[] text = hit.getHighlightFields().get("title").getFragments();
            for (Text str : text) {
                System.out.println(str.string());
            }
        }
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

运行结果:

no modules loaded
loaded plugin [org.elasticsearch.index.reindex.ReindexPlugin]
loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
loaded plugin [org.elasticsearch.script.mustache.MustachePlugin]
loaded plugin [org.elasticsearch.transport.Netty3Plugin]
loaded plugin [org.elasticsearch.transport.Netty4Plugin]
共搜到:1条结果!
String方式打印文档搜索内容:
{
  "title":"java编程思想",
  "content":"《Java编程思想》这本书赢得了全球程序员的广泛赞誉"
}

Map方式打印高亮内容
{title=[title], fragments[[java<h2>编程</h2>思想]]}
遍历高亮集合,打印高亮片段:
java<em>编程</h2>思想

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

截图如下:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中使用 Elasticsearch 搜索高亮,可以使用 HighlightBuilder 类和 SearchRequestBuilder 类来实现。 首先,创建一个 SearchRequestBuilder 对象,然后设置查询条件,如下所示: ``` SearchRequestBuilder searchRequestBuilder = client.prepareSearch("index_name") .setTypes("type_name") .setQuery(QueryBuilders.matchQuery("field_name", "search_text")); ``` 然后创建一个 HighlightBuilder 对象,设置高亮字段和高亮样式,如下所示: ``` HighlightBuilder highlightBuilder = new HighlightBuilder() .field("field_name", 100, 1) .requireFieldMatch(false) .preTags("<span style=\"color:red\">") .postTags("</span>"); ``` 其中,field() 方法设置高亮的字段,第一个参数为字段名,第二个参数为截取的字符数,第三个参数为截取的段数;requireFieldMatch() 方法设置是否需要匹配所有字段;preTags() 和 postTags() 方法设置高亮样式。 最后,将 HighlightBuilder 对象添加到 SearchRequestBuilder 对象中,执行搜索,并获取高亮结果,如下所示: ``` searchRequestBuilder.highlighter(highlightBuilder); SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); for (SearchHit hit : searchResponse.getHits().getHits()) { Map<String, Object> sourceMap = hit.getSourceAsMap(); if (hit.getHighlightFields().containsKey("field_name")) { String highlightedText = hit.getHighlightFields().get("field_name").fragments()[0].string(); sourceMap.put("field_name", highlightedText); } } ``` 其中,highlightedText 变量即为高亮结果。将其设置到 sourceMap 中,即可得到带有高亮搜索结果。 以上就是 Java 中使用 Elasticsearch 搜索高亮实现方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值