zoukankan      html  css  js  c++  java
  • Elasticsearch入门(一)

    索引(index) —— 存储关联数据的地方。实际上,索引只是一个逻辑命名空间(logical namespace),它指向一个或多个分片(shards)。
    分片(shard) 是 工作单元(worker unit) 底层的一员,分片是一个独立的Lucene实例既可,并且它自身也是一个完整的搜索引擎
    ,它只负责保存索引中所有数据的一小片。
    分片分为 主分片(primary shard) 以及 从分片(replica shard) 两种。
    在你的索引中,每一个文档都属于一个主分片,所以具体有多少主分片取决于你的索引能存储多少数据。
    从分片只是主分片的一个副本,它用于提供数据的冗余副本,在硬件故障时提供数据保护,同时服务于搜索和检索这种只读请求。

    索引中的主分片的数量在索引创建后就固定下来了,但是从分片的数量可以随时改变。

    Client

    对于JAVA,Elasticsearch 提供了两个客户端

    节点客户端(Client Node)节点客户端以一个无数据的节点(node.master: false,node.data: false )的身份加入了一个集群,但是他知道什么数据在集群中的哪一个节点上,然后就可以请求转发到正确的节点上并进行连接。

    传输客户端(Transport Client)传输客户端不加入集群本身,通过向远程集群发送请求来通讯。

    这两个客户端都使用 Elasticsearch 的传输协议,通过9300端口与 java 客户端进行通信。集群中的各个节点也是通过9300端口进行通信。

    其他的语言可以通过9200端口与 Elasticsearch 的 RESTful API 进行通信。

    创建Client

    Settings settings = Settings.settingsBuilder()
                    .put("cluster.name", "es-cluster").build();
            Client client = TransportClient.builder().settings(settings).build()
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("10.9.22.35"), 9301))
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("10.9.22.35"), 9302))
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("10.9.22.35"), 9303));
    

    Client Settings

    cluster.name 集群名称,如果不为“elasticsearch” 需要在创建client时指定
    client.transport.sniff 开启集群嗅探功能,探测集群中节点的添加与删除
    client.transport.ignore_cluster_name 设置为true忽略连接的节点集群名称验证
    client.transport.ping_timeout Ping一个节点响应超时时间 默认5s
    client.transport.nodes_sampler_interval 多长时间间隔尝试ping和连接Node节点 默认5s

    异常:

    1. not part of the cluster Cluster [elasticsearch], ignoring...
    2. org.elasticsearch.client.transport.NoNodeAvailableException: No node available
      因为没有指定集群名称,指定后解决。

    Index

    你可能发现在 Elasticsearch 中,索引这个词汇已经被赋予了太多意义,所以在这里我们有必要澄清一下:

    索引 (名词)
    如上文所说,一个 索引 就类似于传统关系型数据库中的 数据库。这里就是存储相关文档的的地方。

    索引 (动词)
    为一个文档创建索引 是把一个文档存储到一个索引(名词)中的过程,这样它才能被检索。这个过程非常类似于 SQL 中的 INSERT 命令,如果已经存在文档,新的文档将会覆盖旧的文档。

    反向索引
    在关系数据库中的某列添加一个 索引,比如多路搜索树(B-Tree)索引,就可以加速数据的取回速度, Elasticsearch 以及 Lucene 使用的是一个叫做 反向索引(inverted index) 的结构来实现相同的功能。

    Index Api 允许将一个Json文档索引到一个特定的索引中并可以搜索到

      List<BcShop> list = new ArrayList<BcShop>();
            list.add(new BcShop(1936212235,"鑫釜山铁桶海鲜烧烤(霄云路店)","霄云路15号","010-64388850",new Date()));
            list.add(new BcShop(515636,"眉州东坡酒楼(中关村店)","中关村大街27号中关村大厦2层(地铁海淀黄庄站北)","010-59683322",new Date()));
            list.add(new BcShop(19604619,"辣家私厨(百子湾店)","黄木厂路六号D座(今日美术馆对面)","010-87781377",new Date()));
            list.add(new BcShop(22974252,"脑馋粉儿(三里屯店","三里屯SOHO商场5 B1-506(下沉广场直行150米左侧)","010-58494433",new Date()));
            list.add(new BcShop(510689,"金百万烤鸭店(马甸店)","马甸裕民路3号(牡丹园)","010-62380012",new Date()));
            list.add(new BcShop(512885,"味多美(广安门店)","广内大街白广路306号","010-63589375",new Date()));
            for(BcShop bc :list){
                IndexResponse response=client.prepareIndex("test_sale","test_shop").setSource(JSON.toJSONString(bc)).get();
                if (response.isCreated()) {
                    System.out.println("创建成功!");
                }
            }
    
    

    批量操作

     
     List<BcShop> list= shopService.getList(10,1000);
     BulkRequestBuilder bulkRequestBuilder = client.prepareBulk().setRefresh(true);
     for (BcShop shop :list){
            bulkRequestBuilder.add(client.prepareIndex("test_sale","test_shop")
                    .setSource(JSON.toJSONString(shop)));
        }
    bulkRequestBuilder.execute().actionGet();
    
    

    Query

      QueryBuilder builder = QueryBuilders.termQuery("shop_id", 1936212235);
            SearchResponse response = client.prepareSearch("test_sale").setTypes("test_shop").setQuery(builder).get();
            SearchHits hits = response.getHits();
            if (hits.totalHits() > 0) {
                for (SearchHit hit : hits) {
                    System.out.println("score:" + hit.getScore() + ":	" + hit.getSource().get("shop_name"));
                }
            }
    
  • 相关阅读:
    审核系统
    ehcache 缓存
    tomcat 内存设置
    html5 开发 跨平台 桌面应用
    service thread 结合使用
    html5桌面应用
    鼠标 事件
    服务器 判断 客户端 文件下载
    使用github管理Eclipse分布式项目开发
    uub代码
  • 原文地址:https://www.cnblogs.com/javanoob/p/elasticsearch_part1.html
Copyright © 2011-2022 走看看