ElasticSearch流水账

一: ElasticSearch 基本概念

INDEX:这是ES存储数据的地方,类似于关系数据库的DATABASE。


Document TYPE:嗯,类似关系数据库的表,主要功能是将完全不同SCHEMA(这个概念以后会讲到,不急)的数据分开,一个INDEX里面可以有若干个Document TYPE。


Document:好吧,这个类似关系数据库的一行,在同一个Document TYPE下面,每一Document都有一个唯一的ID作为区分;


Filed:类似关系数据库的某一列,这是ES数据存储的最小单位。


Cluster和Node:ES可以以单点或者集群方式运行,以一个整体对外提供search服务的所有节点组成cluster,组成这个cluster的各个节点叫做node。


shard:通常叫分片,这是ES提供分布式搜索的基础,其含义为将一个完整的INDEX分成若干部分存储在相同或不同的节点上,这些组成INDEX的部分就叫做shard。


Replica:和REPLICATION通常指的都是一回事,即INDEX的冗余备份,可以用于防止数据丢失,或者用来做负载分担。

二: ElasticSearch TransportClient和NodeClient
如果你使用Java,ElasticSearch 提供Transport CLIENT和Node CLIENT两种连接方式。

节点客户端(node client): 
节点客户端以无数据节点(none data node)身份加入集群,换言之,它自己不存储任何数据,但是它知道数据在集群中的具体位置,并且能够直接转发请求到对应的节点上。需要完整的Node节点参数配置。

传输客户端(Transport client): 
这个更轻量的传输客户端能够发送请求到远程集群。它自己不加入集群,只是简单转发请求给集群中的节点。

两种CLIENT的使用场景:

1.如果你想让你的应用和集群解耦,transport CLIENT是一个理想的选择。例如,如果你的集群快速创建和销毁连接,那么transport CLIENT比node CLIENT轻很多,因为它不是集群的一部分。同样,如果你需要创建上千个连接,但是你不希望有上千个node CLIENT加入你的集群,transport CLIENT将是一个更好的选择。

2.在另一方面,如果你只需要几个长连接的,能持久的连接到集群,node CLIENT会更高效一点,因为它知道集群的结构,但是要注意防火墙影响相关通信的问题。

es5不支持删除type,想要删除type有两种选择: 
1.重新设置index。 
2.删除type下的所有数据。

三:Spring-data-elasticsearch为我们提供了@Document@Field等注解,如果某个实体需要建立索引,只需要加上这些注解即可。

在需要建立索引的类上加上@Document注解,即表明这个实体需要进行索引。其定义如下:

@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {
 
String indexName();//索引库的名称,个人建议以项目的名称命名
 
String type() default "";//类型,个人建议以实体的名称命名
 
short shards() default 5;//默认分区数
 
short replicas() default 1;//每个分区默认的备份数
 
String refreshInterval() default "1s";//刷新间隔
 
String indexStoreType() default "fs";//索引文件存储类型
}

加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词

我们通过@Field注解来进行详细的指定,如果没有特殊需求,那么只需要添加@Document即可。

@Field注解的定义如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {
 
FieldType type() default FieldType.Auto;#自动检测属性的类型
 
FieldIndex index() default FieldIndex.analyzed;#默认情况下分词
 
DateFormat format() default DateFormat.none;
 
String pattern() default "";
 
boolean store() default false;#默认情况下不存储原文
 
String searchAnalyzer() default "";#指定字段搜索时使用的分词器
 
String indexAnalyzer() default "";#指定字段建立索引时指定的分词器
 
String[] ignoreFields() default {};#如果某个字段需要被忽略
 
boolean includeInParent() default false;
}

需要注意的是,这些默认值指的是我们没有在属性上添加@Filed注解的默认处理。一旦添加了@Filed注解,所有的默认值都不再生效。此外,如果添加了@Filed注解,那么type字段必须指定。

四:spring data elsaticsearch提供了三种构建查询模块的方式: 
1. 基本的增删改查:继承spring data提供的接口就默认提供 
2. 接口中声明方法:无需实现类,spring data根据方法名,自动生成实现类,方法名必须符合一定的规则(这里还扩展出一种忽略方法名,根据注解的方式查询) 
3. 自定义repository:在实现类中注入elasticsearchTemplate,实现上面两种方式不易实现的查询(例如:聚合、分组、深度翻页等)

上面的第一点和第二点只需要声明接口,无需实现类,spring data会扫描并生成实现类

五:自定义Repository接口:使用elasticsearchTemplate实现复杂查询

public interface OrderEsCommonRepository {
    /**
     * 创建索引
     * @return
     */
    public boolean createOrderIndex();
}
/**
 * 基础的repository接口
 *
 * spring data自动生成实现类,此处集成自定义的接口是为了在自动生成的实现类中添加自定义的实现(注意:实现类是这个基础的repository接口加上Impl后缀,这样才能被spring自动扫描到)
 *
 *  ElasticsearchRepository 继承 PagingAndSortingRepository, PagingAndSortingRepository提供了分页和排序的支持
 */
public interface OrderRepository extends ElasticsearchRepository<Order, Long>, OrderEsCommonRepository {

    /**
     * spring data提供的根据方法名称的查询方式
     * @param userName
     * @param skuName
     * @return
     */
    public Order findByUserNameAndSkuName(String userName, String skuName);

    /**
     * 使用Query注解指定查询语句
     * @param userName
     * @param skuName
     * @return
     */
    //双引号和不加引号都可,不能是单引号
//    @Query("{bool : {must : [ {field : {userName : ?}}, {field : {skuName : ?}} ]}}")   . //---   field查询已经废弃,可参考当前查询语法,已换成term查询
    @Query("{\"bool\" : {\"must\" : [ {\"term\" : {\"skuName\" : \"?1\"}}, {\"term\" : {\"userName\" : \"?0\"}} ]}}")
    //注意:需要替换的参数?需要加双引号;需要指定参数下标,从0开始
    public Order findByUserNameAndSkuName2(String userName, String skuName);

    //还有分页、排序等API
}
实现类:实现了创建索引的方法,其余基础repository接口中的方法无需实现。

/**
 * 自定义Repository实现类
 *
 * 接口的实现类名字后缀必须为impl才能在扫描包时被找到(可参考spring data elasticsearch自定义repository章节)
 *
 */
public class OrderRepositoryImpl implements OrderEsCommonRepository {

    private ElasticsearchTemplate elasticsearchTemplate;

    /**
     * 创建索引
     * @return
     */
    public boolean createOrderIndex() {
        return elasticsearchTemplate.createIndex(Order.class);
    }


    //自定义实现可以使用ElasticsearchTemplate做复杂的查询,例如:分组、聚合等,
    //增加了spring data elasticsearch的灵活度,使用方法名定义和Query注解实现困难的查询操作,可借助ElasticsearchTemplate实现自定义的查询


    public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) {
        this.elasticsearchTemplate = elasticsearchTemplate;
    }
}
实现类必须是基础查询接口加Impl(后缀Impl可配置)



展开阅读全文

没有更多推荐了,返回首页