11、 ElasticSearch学习笔记

Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据。基于Lucene开发,底层还是Lucene。

es与Solr对比
Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能
Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式
Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供
Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch

安装的elasticsearch-5.6.8是非图形化的,想要图形化操作需要安装nnode.js和elasticsearch-head-master,

使用grunt server命令启动图形化插件

Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,可以对文档进行索引、搜索、排序、过滤。










索引 index:一个拥有几分相似特征的文档的集合。
类型 type:在一个索引中,可以定义一种或多种类型,一个类型是索引的一个逻辑上的分类/分区。
字段Field:相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。
映射 mapping:是处理数据的方式和规则方面的一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等。
文档 document:是一个可被索引的基础信息单元,在一个index/type里面,可以存储任意多的文档。

集群 cluster:由多个节点组织在一起,共同持有整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,默认名字就是“elasticsearch”。不同的集群通过不同的名字来标识,节点只能通过指定集群的名字来加入这个集群。
节点 node:集群中的一个服务器,作为集群的一部分存储数据,参与集群的索引和搜索功能。不同的节点由不同的名字来标识,名字会在启动时赋予节点。一个节点可以通过配置集群名称的方式来加入一个指定的集群。

一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间,或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。创建一个索引的时候可以指定分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。分片允许水平分割/扩展内容容量;允许在分片之上进行分布式的、并行的操作,进而提高搜索性能/吞吐量。至于分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的来说是透明看不到的。










主要有三种方式可以作为elasticsearch服务的客户端
使用elasticsearch-head插件
使用elasticsearch提供的Restful接口直接访问
使用elasticsearch提供的API进行访问










使用java客户端创建index步骤
1.创建一个Java工程
2.添加jar包,添加maven的坐标

<dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>5.6.8</version>
    </dependency>

3.编写测试方法实现创建索引库
(1)创建一个Settings对象,相当于是一个配置信息,配置"my‐elasticsearch"集群名称。
Settings settings = Settings.builder().put(“cluster.name”, “my‐elasticsearch”).build();
(2)创建一个客户端Client对象
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(newInetSocketTransportAddress(InetAddress.getByName(“127.0.0.1”),9300));
(3)使用client对象创建一个索引库
client.admin().indices().prepareCreate(“blog2”).get();
(4)创建一个mapping信息,应该是一个json数据,可以是字符串,也可以是XContextBuilder对
(5)关闭client对象
client.close();

使用java客户端设置Mappings步骤
(1)创建一个Settings对象,相当于是一个配置信息,配置"my‐elasticsearch"集群名称。
(2)创建一个客户端Client对象
(3)创建一个mapping信息,应该是一个json数据,可以是字符串,也可以是XContextBuilder对象

XContentBuilder builder = XContentFactory.jsonBuilder()
    .startObject()
        .startObject("article")
            .startObject("properties")
                .startObject("id")
                    .field("type", "long")
                    .field("store", "yes")
                 .endObject()
                .startObject("title")
                    .field("type", "string")
                    .field("store", "yes")
                    .field("analyzer", "ik_smart")
                .endObject()
                .startObject("content")
                    .field("type", "string")
                    .field("store", "yes")
                    .field("analyzer", "ik_smart")
                 .endObject()
            .endObject()
        .endObject()
    .endObject();

(4)使用client向es服务器发送mapping信息

 client.admin().indices().preparePutMapping("blog2").setType("article").setSource(builder).get();

(5)关闭client对象

使用java客户端添加文档步骤
(1)创建一个Settings对象
(2)创建一个Client对象
(3)创建一个文档对象,创建一个json格式的字符串,或者使用XContentBuilder

XContentBuilder builder = XContentFactory.jsonBuilder()
    .startObject()
        .field("id", 1)
        .field("title", "搜索服务器")
        .field("content", "提供了分布式多用户能力的全文搜索引擎,")
    .endObject();Article article = new Article();
    article.setId(2);
    article.setTitle("搜索服务器");
    article.setContent("提供了分布式多用户能力的全文搜索引擎");
    ObjectMapper objectMapper = new ObjectMapper();

(4)使用Client对象吧文档添加到索引库中

client.prepareIndex("index_hello", "article", "1").setSource(builder).get();

 client.prepareIndex("index_hello", "article", "2").setSource(objectMapper.writeValueAsString(article)).get();

(5)关闭client

使用java客户端搜索文档
QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds(“1”, “2”);

QueryBuilder queryBuilder = QueryBuilders.termQuery(“title”, “快乐”);

QueryBuilder queryBuilder = QueryBuilders.queryStringQuery(“快乐”).defaultField(“title”);
然后使用如下语句搜索,其中标红的是设置分页,可以不配,不配值默认一页10个结果
SearchResponse searchResponse = client.prepareSearch(“index_hello”).setTypes(“article”).setQuery(queryBuilder).setFrom(0).setSize(5).get();










Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API进行封装 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值