Elasticsearch 5.1.1搜索高亮及Java API实现

来源:互联网 发布:手机使用统计软件 编辑:程序博客网 时间:2024/04/29 20:58

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

创建mapping:

POST blog/article/_mapping{    "article": {             "_all": {            "analyzer": "ik_max_word",            "search_analyzer": "ik_max_word",            "term_vector": "no",            "store": "false"        },        "properties": {            "title": {                "type": "text",                "analyzer": "ik_max_word",                "search_analyzer": "ik_max_word",                "include_in_all": "true",                "boost": 8            },            "content": {                "type": "text",                "analyzer": "ik_max_word",                "search_analyzer": "ik_max_word",                "include_in_all": "true",                "boost": 4            }        }    }}

二、索引测试文档

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

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

文档2:

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

文档3:

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

三、REST高亮API

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

POST blog/_search{  "query": {    "match": {      "title": "java"    }  },  "highlight": {    "fields": {      "title": {        "pre_tags": "<strong>",        "post_tags": "</strong>"      }    }  }}

查询结果:

    "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>编程思想"          ]        }      }    ]  }}

这里写图片描述

四、搜索高亮的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());            }        }    }}

运行结果:

no modules loadedloaded 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>思想

截图如下:

这里写图片描述

4 0