ElasticSearch

  • 1.ElasticSearch(简称ES)

ES即为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案,其第一个版本于2010年2月出现在GitHub上并迅速成为最受欢迎的项目之一。
首先,ES的索引库管理支持依然是基于Apache Lucene™的开源搜索引擎。
ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的
RESTfulAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。 不过,ES的核心不在于Lucene,其特点更多的体现为:
分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
高度集成化的服务,你的应用可以通过简单的 RESTful API、各种语言的客户端甚至命令行与之 交互。
上手Elasticsearch非常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它拥有开瓶即饮的效果(安装即可使用),只需很少的学习既可在生产环境中使用

  • 3.辅助管理工具Kibana5

① Kibana5.2.2下载地址:https://www.elastic.co/downloads/kibana
② 解压并编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES
③ 启动Kibana5 : bin\kibana.bat
④ 默认访问地址:http://localhost:5601
Discover:可视化查询分析器
Visualize:统计分析图表
Dashboard:自定义主面板(添加图表)
Timelion:Timelion是一个kibana时间序列展示组件(暂时不用)
Dev Tools :Console(同CURL/POSTER,操作ES代码工具,代码提示,很方便)
Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性。

  • 4.ES数据管理

ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
ES使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。

_index:索引库,类似于关系型数据库里的“数据库”—它是我们存储和索引关联数据的地方。
_type:在应用中,我们使用对象表示一些“事物”,例如一个用户、一篇博客、一个评论,或者一封邮件。可以是大写或小写,不能包含下划线或逗号。我们将使用
employee 做为类型名。
_id:与 _index 和 _type 组合时,就可以在ELasticsearch中唯一标识一个文档。当创建一个文档,你可以自定义 _id ,也可以让Elasticsearch帮你自动生成。 另外还包括:_uid文档唯一标识(_type#_id)
_source:文档原始数据
_all:所有字段的连接字符串

  • 5.分词与映射
    IK分词器

IK分词器有两种类型,分别是ik_smart分词器和ik_max_word分词器。 ik_smart:
会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。 ik_max_word:
会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,

文档映射Mapper

① 基本字段类型
字符串:text(分词),keyword(不分词) StringField(不分词文本),TextFiled(要分词文本)
text默认为全文文本,keyword默认为非全文文本
数字:long,integer,short,double,float
日期:date
逻辑:boolean
② 复杂数据类型
对象类型:object
数组类型:array
地理位置:geo_point,geo_shape

  • 6.java代码操作
    1.连接es服务器
   public static TransportClient getClient() throws  Exception{
//    连接es服务器,两个端口pc java程序通过9300连接es     9200是web连接端口
       TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
               .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"),9300));
        return  client;
    }

2.添加

 @Test
    public void testGreated() throws Exception{
//        获取client对象
        TransportClient client = getClient();
        IndexRequestBuilder indexRequestBuilder = client.prepareIndex("crm", "user", "1");
        Map<String,Object> mp = new HashMap();
        mp.put("id", 2);
        mp.put("name", "我是添加");
        mp.put("age", 18);
        IndexResponse indexResponse = indexRequestBuilder.setSource(mp).get();
        System.out.println(indexRequestBuilder);
    }

3.更新存在文档

 @Test
    public void testupdate() throws Exception{
//      连接ES获取Client对象
        TransportClient client = getClient();
        Map<String,Object> mp = new HashMap();
        mp.put("id", 2);
        mp.put("name", "我是更新的数据");
        mp.put("age", 19);
        UpdateResponse updateResponse = client.prepareUpdate("crm", "user", "1").setDoc(mp).get();
        System.out.println(updateResponse);
    }

4.删除文档

@Test
    public void testDelete() throws Exception{
        TransportClient client = getClient();
        DeleteResponse deleteResponse = client.prepareDelete("crm", "user", "1").get();
        System.out.println(deleteResponse);
    }

5.批量操作

    @Test
    public void testBulk() throws Exception{
//        获取客户端es对象
        TransportClient client = getClient();
//        批量请求对象
        BulkRequestBuilder builder = client.prepareBulk();

        for (int i=0;i<15;i++){
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("id", i);
            map.put("name", "crm"+i);
            map.put("age", 18+i);
            map.put("class", 1);
            builder.add(client.prepareIndex("crm","user",i+"").setSource(map));
        }
//        提交请求
        BulkResponse bulkItemResponses = builder.get();
        if (bulkItemResponses.hasFailures()){
            System.out.println("error");
        }
        client.close();
    }

6.条件查询

  1. 1班的人 过滤 age 20-25 分页 0, 3 sort id desc
 @Test
    public void testSearch() throws Exception{
//        获取客户端es对象
        TransportClient client = getClient();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//      匹配   class=1
        List<org.elasticsearch.index.query.QueryBuilder> must = boolQueryBuilder.must();
        must.add(QueryBuilders.termQuery("class", "1"));
//     搜索 1班的人  过滤 age 20-25  分页 0, 3   sort id desc



        List<org.elasticsearch.index.query.QueryBuilder> filter = boolQueryBuilder.filter();
        filter.add(QueryBuilders.rangeQuery("age").gte(20).lte(25));



//        设置分页 排序 order by id desc
        SearchResponse searchResponse = client.prepareSearch("crm").setFrom(0).setSize(3)
                .setQuery(boolQueryBuilder)
                .addSort("id", SortOrder.ASC).get();
        System.out.println("总条数:"+searchResponse.getHits().getTotalHits());


        SearchHit[] hits = searchResponse.getHits().getHits();
        for(SearchHit hit :hits){
            System.out.println(hit.getSource());
        }
        client.close();
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值