非SpringBoot情况下使用ElasticSearch

首先添加核心POM包

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>2.4.5</version>
</dependency>

几种查询类型,多数情况下用分页和高亮

package com.ego;

import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;

public class ElasticsearchTest {

    private static Logger logger = LoggerFactory.getLogger(ElasticsearchTest.class);

    // 服务器地址
    public static final String HOST = "127.0.0.1";

    // 服务器端口
    public static final int PORT = 9300;

    // 集群名称
    public static final String CLUSTER_NAME = "es";

    // 客户端
    private TransportClient client = null;

    // 设置属性
    private static Settings settings = Settings.builder()
            // 设置集群名称
            .put("cluster.name", CLUSTER_NAME)
            // 开启嗅探模式自动嗅探整个集群的状态,es会自动把集群中其它机器的ip地址加到客户端中
            .put("client.transport.sniff", true)
            .build();

    /**
     * 获取客户端连接信息
     */
    @Before
    public void getConnect() {
        try {
            /*
            // 也可以通过map来配置属性
            Map<String, String> map = new HashMap<>();
            map.put("cluster.name", CLUSTER_NAME);
            private static Settings settings = Settings.builder().put(map);
            */
            client = TransportClient.builder().settings(settings).build()
                    .addTransportAddresses(new InetSocketTransportAddress(InetAddress.getByName(HOST), PORT));
            logger.info("连接信息:" + client.toString());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查询单条
     */
    @Test
    public void testQuery01() {
		//查询索引库、类型、主键
        GetResponse response = client.prepareGet("Aaron", "goods", "1")
                .execute().actionGet();
        System.out.println(response.getSource());
    }

    /**
     * 匹配查询
     */
    @Test
    public void testQuery02() {
        // 指定查询的索引库和类型
        SearchRequestBuilder builder = client.prepareSearch("Aaron", "ik")
                .setTypes("goods", "ikType");
        // 设置查询的关键词
        String key = "中国";
        // 指定查询的列
        builder.setQuery(QueryBuilders.multiMatchQuery(key, "goodsName", "content"));
        // 开始查询
        SearchResponse response = builder.get();
        // 获取命中数据
        SearchHits searchHits = response.getHits();
        // 获取命中数据总条数
        System.out.println("查询结果总条数:" + searchHits.getTotalHits());
        for (SearchHit hit : searchHits) {
            System.out.println("索引库:" + hit.getIndex());
            System.out.println("类型:" + hit.getType());
            System.out.println("主键:" + hit.getId());
            System.out.println("分数:" + hit.getScore());
            // 获取原数据
            Map<String, Object> sourceMap = hit.getSource();
            for (Map.Entry<String, Object> source : sourceMap.entrySet()) {
                System.out.println(source.getKey() + "---" + source.getValue());
            }
            // JSON
            System.out.println(hit.getSourceAsString());
            System.out.println("---------------分割线---------------");
        }
    }

    /**
     * 查询所有
     */
    @Test
    public void testQuery03() {
        // 指定查询的索引库和类型
        SearchRequestBuilder builder = client.prepareSearch("Aaron", "ik")
                .setTypes("goods", "ikType");
        // 查询所有数据
        builder.setQuery(QueryBuilders.matchAllQuery());
        // 开始查询
        SearchResponse response = builder.get();
        // 获取命中数据
        SearchHits searchHits = response.getHits();
        // 获取命中数据总条数
        System.out.println("查询结果总条数:" + searchHits.getTotalHits());
        for (SearchHit hit : searchHits) {
            System.out.println("索引库:" + hit.getIndex());
            System.out.println("类型:" + hit.getType());
            System.out.println("主键:" + hit.getId());
            System.out.println("分数:" + hit.getScore());
            // 获取原数据
            Map<String, Object> sourceMap = hit.getSource();
            for (Map.Entry<String, Object> source : sourceMap.entrySet()) {
                System.out.println(source.getKey() + "---" + source.getValue());
            }
            // JSON
            System.out.println(hit.getSourceAsString());
            System.out.println("---------------分割线---------------");
        }
    }

    /**
     * 分页查询
     */
    @Test
    public void testQuery04() {
        testQueryPage(2, 5);
    }

    private void testQueryPage(Integer pageNum, Integer pageSize) {
        // 指定查询的索引库和类型
        SearchRequestBuilder builder = client.prepareSearch("Aaron").setTypes("goods");
        // 设置分页
        builder.setFrom((pageNum - 1) * pageSize).setSize(pageSize);
        // 设置查询的关键词
        String key = "中国移动联通电信";
        // 指定查询的列
        builder.setQuery(QueryBuilders.multiMatchQuery(key, "goodsName"));
        // 开始查询
        SearchResponse response = builder.get();
        // 获取命中数据
        SearchHits searchHits = response.getHits();
        // 获取命中数据总条数
        System.out.println("查询结果总条数:" + searchHits.getTotalHits());
        for (SearchHit hit : searchHits) {
            System.out.println("索引库:" + hit.getIndex());
            System.out.println("类型:" + hit.getType());
            System.out.println("主键:" + hit.getId());
            System.out.println("分数:" + hit.getScore());
            // 获取原数据
            Map<String, Object> sourceMap = hit.getSource();
            for (Map.Entry<String, Object> source : sourceMap.entrySet()) {
                System.out.println(source.getKey() + "---" + source.getValue());
            }
            // JSON
            System.out.println(hit.getSourceAsString());
            System.out.println("---------------分割线---------------");
        }
    }

    /**
     * 高亮查询
     */
    @Test
    public void testQuery05() {
        // 指定查询的索引库和类型
        SearchRequestBuilder builder = client.prepareSearch("Aaron").setTypes("goods");
        // 设置分页
        builder.setFrom(0).setSize(5);
        // 设置高亮前缀
        builder.setHighlighterPreTags("<span style='color:red;'>");
        // 设置高亮后缀
        builder.setHighlighterPostTags("</span>");
        // 设置高亮字段名称
        builder.addHighlightedField("goodsName");
        // 设置查询的关键词
        String key = "中国移动联通电信";
        // 指定查询的列
        builder.setQuery(QueryBuilders.multiMatchQuery(key, "goodsName"));
        // 开始查询
        SearchResponse response = builder.get();
        // 获取命中数据
        SearchHits searchHits = response.getHits();
        // 获取命中数据总条数
        System.out.println("查询结果总条数:" + searchHits.getTotalHits());
        for (SearchHit hit : searchHits) {
            /*
            System.out.println("索引库:" + hit.getIndex());
            System.out.println("类型:" + hit.getType());
            System.out.println("主键:" + hit.getId());
            System.out.println("分数:" + hit.getScore());
            // 获取原数据
            Map<String, Object> sourceMap = hit.getSource();
            for (Map.Entry<String, Object> source : sourceMap.entrySet()) {
                System.out.println(source.getKey() + "---" + source.getValue());
            }
            // JSON
            System.out.println(hit.getSourceAsString());
            // 高亮信息
            String highlightMessage = hit.getHighlightFields().get("goodsName").getFragments()[0].toString();
            */
            // 根据项目所需构建返回结果集
            String highlightMessage = String.valueOf(hit.getHighlightFields().get("goodsName").fragments()[0]);
            Integer goodsId = (Integer) hit.getSource().get("goodsId");
            String goodsName = String.valueOf(hit.getSource().get("goodsName"));
            String originalImg = String.valueOf(hit.getSource().get("originalImg"));
            BigDecimal marketPrice = new BigDecimal(String.valueOf(hit.getSource().get("marketPrice")));

            System.out.println("goodsId: " + goodsId);
            System.out.println("goodsName: " + goodsName);
            System.out.println("goodsNameHl: " + highlightMessage);
            System.out.println("marketPrice: " + marketPrice);
            System.out.println("originalImg: " + originalImg);
            System.out.println("---------------分割线---------------");
        }
    }

    /**
     * 关闭连接
     */
    @After
    public void closeConnect() {
        if (null != client)
            client.close();
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值