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

创建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.postTags("<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 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<em>编程</h2>思想]]}
遍历高亮集合,打印高亮片段:
java<em>编程</h2>思想

截图如下:

时间: 2024-08-08 13:54:39

Elasticsearch 5.1.1搜索高亮及Java API实现的相关文章

ElasticSearch笔记整理(三):Java API使用与ES中文分词

[TOC] pom.xml 使用maven工程构建ES Java API的测试项目,其用到的依赖如下: <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>2.3.0</version> </dependency> <dependency> <grou

如何快速掌握官方提供的java API文档使用技巧

API的特点就是查阅方便,无需购买任何书籍,通过在线API文档官方网站,就可以随时随地查看JDK文档(即API文档),为编程提供极大的便利,节省了大量的时间.在线API文档的具体使用方法如下: 1.打开浏览器(任何一个浏览器都可以) 2.在搜索框输入java api,单击“百度一下”进行搜索 3.搜索完成后,鼠标下滑就能看到“在线API文档”字样了,单击超链接即可进入网站 4.进入网站后,直接单击“常用API文档索引”下面的java咖啡图标,进入文档 5.下面这个页面就是java api文档主页

elasticsearch java API 实现搜索样例

查看cluster.version:curl 'centos1:9200'插入:curl -XPUT 'http://localhost:9200/dept/employee/1' -d '{ "empname": "emp1"}'查看index:curl 'centos1:9200/_cat/indices?v'查看1条内容:curl 'centos1:9200/dept/employee/1?pretty'查看所有内容:curl 'centos1:9200/de

Elasticsearch Java API(八)--搜索有相同父id的子文档

需求: 搜索具有相同父id的所有子文档. 数据:    mapping:      { "mappings": { "branch": {}, "employee": { "_parent": { "type": "branch" } } } } 父文档: { "index": { "_id": "london" }} { &q

Elasticsearch java api 基本搜索部分详解

版权声明:本文非原创文章,转载出处:http://blog.csdn.net/molong1208/article/details/50512149 一.所使用版本的介绍 使用的是elasticsearch2.1.0版本,在此只是简单介绍搜索部分的api使用 二.简单的搜索 使用api的时候,基本上可以将DSL搜索的所有情况均写出来,在此给出一个最简单搜索的全部的过程以及代码,之后将对不同的搜索只是针对函数进行介绍 (1)DSL搜索 对于最简单的DSL搜索,对一个词进行搜索使用url直接进行通信

Elasticsearch Java API(七)--多级嵌套搜索

要在java中实现一个有三级父子关系的嵌套搜索,相关资料很少,发在stackoverflow上以后一个Switzerland的大神很快回复了我,google+stackoverflow很好使.对应的命令行query: { "query": { "has_child": { "type": "instance", "query": { "has_child": { "type&q

大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 Elasticsearch 的特点1.7 Elasticsearch 的核心概念1.7.1 近实时1.7.2 Cluster(集群)1.7.3 Node(节点)1.7.4 Index(索引 --> 数据库)1.7.5 Type(类型 --> 表)1.7.6 Document(文档 -->

独孤九剑之Elasticsearch Java API破剑式

0.题记之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要在海量的数据中找到和自己相关的业务数据,实现对已有的数据实现全文检索.分类统计等功能并应用到业务系统中,必须借助Java API来实现. 1.Elasticsearch Java API 概览Elasticsearch Java API 相关使用研究结果: 1.1 国内的博文讲解Elasticsear

使用JAVA操作ElasticSearch(Java API 和Spring Data ElasticSearch)

Java API 我的ElasticSearch集群的版本是6.2.4,导入elasticsearch相关的maven依赖也是6.2.4,不同版本的api可能会有差异 一:maven依赖 <!--elasticsearch核心依赖--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version