欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ElasticSearch

程序员文章站 2022-07-01 09:41:17
...
  • 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();
    }
相关标签: ElasticSearch

上一篇: 全文检索

下一篇: 小沈阳经典台词