如果你想阅读更详细的内容请点击这里-SpringDataElasticsearch使用参考文档-机器翻译 前提:你得有一个运行起来的Elasticsearch节点

在这之前,你可能用过各种springboot的data-start。既然你看到了这篇文章,那么今天就让我们一起来学习一下。

1、万恶的开始
1.1、必须的pom引入,如果你不知道去哪里找,请点击这里去选择你需要的版本。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

1.2、
使用springboot的配置文件配置Elasticsearch:properties属性配置(其他属性自行配置),如果不配置链接属性,则默认使用localhost:9200链接

spring:
  data:
    elasticsearch:
      client:
        reactive:
          endpoints: 127.0.0.1:9200
          connection-timeout: 链接到es的超时时间,毫秒为单位,默认10秒(10000毫秒)
          socket-timeout: 读取和写入的超时时间,单位为毫秒,默认5秒(5000毫秒)
  elasticsearch:
    rest:
      uris: 127.0.0.1:9200
#     这两个属性在新版本的springboot中已经不建议使用,9300属于elasticsearch各节点之间的通讯接口。
#     属于lowlevelclient。我们推荐使用9200的RestHighLevelClient去链接
#     cluster-nodes: 127.0.0.1:9300
#     cluster-name: helloElasticsearch

1.3、使用JAVA方式配置

/**
 * @author scarecrow
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "elastic")
public class ElasticsearchConfig {

    private String host;
    private Long connectTimeout;
    private Long socketTimeout;
    //private int port;


    @Bean
    public RestHighLevelClient client(){
        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo(host)
                .withConnectTimeout(connectTimeout)
                .withSocketTimeout(socketTimeout)
                .build();
        return RestClients.create(clientConfiguration).rest();
    }


    /*9@Bean
    public RestHighLevelClient client(){
        HttpHost httpHost = new HttpHost("127.0.0.1",9200);
        RestClientBuilder builder = RestClient.builder(httpHost);
        builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
            @Override
            public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
                return builder.setSocketTimeout(socketTimeout.intValue()).setConnectTimeout(connectTimeout.intValue());
            }
        });
        RestHighLevelClient highLevelClient = new RestHighLevelClient(builder);
        return highLevelClient;
    }*/

}

2.简单查询
2.1实体类注解

  • Document
  • indexName:索引的名字
  • type:文档类型名称
  • shards:分片数,默认5
  • replicas:副本数量,默认1
  • createIndex:是否创建索引(索引不存在的情况下),默认true
  • useServerConfiguration:创建索引的时候,是否使用服务端的配置,默认为false
  • refreshInterval:刷新频率即配置一个文档新增后多久可以查询到,默认为1秒
  • indexStoreType:索引存储方式,默认为fs文件存储类型
  • Field
  • format:时间格式,默认无,存储毫秒数。具体参数可参照org.springframework.data.elasticsearch.annotations.DateFormat
  • index:是否进行分词,默认为true
  • searchAnalyzer:指定字段搜索时使用的分词器
  • analyzer:指定字段建立索引时所使用的分词器
  • ignoreFields:指定忽略字段
  • type:指定字段类型,具体可参照org.springframework.data.elasticsearch.annotationsFieldType
  • 例子
@Document(indexName = "user", type = "user")
public class Person {

    @Id//必须有id注解
    private String id;
    private String name;
    private int age;
    private String idCard;
}

2.2:Repository
类似于jpa,我们写Repository的时候只需继承ElasticsearchRepository<T,IdType>即可。该接口继承了ElasticsearchCrudRepository,可以实现一些基本的增删查改操作。操作和jpa类似。同样支持属性表达式

  • 增/改:add,addAll
  • 删:deleteXXXX
  • 查:findXXXX
  • 例子
@Repository
public interface PersonRep extends ElasticsearchRepository<Person, String> {
}
........
{
@AutoWried
private PersonRep  personRep;
...
personRep.findAll();
personRep.findAll(pageable);
personRep.save();
personRep.findByName(name);
...
}

2.3:可能有点儿高级的搜索

  • 2.3.1 限制查询结果的数量使用top或者first关键字可以互换使用。将可选的数值附加到top或者or后面指定要返回的结果数量大小。如果缺省则默认返回一条。
//下面两条查询的效果是一样的
personRep.findFirst3ByName(name);
personRep.findTop3ByName(name);
//只查一条
personRep.findTopByName(name)

异常整理

/**
* Springboot整合Elasticsearch 在项目启动前设置一下的属性,防止报错
* 解决netty冲突后初始化client时还会抛出异常
* java.lang.IllegalStateException: availableProcessors is already set to [4], rejecting [4]
*/
System.setProperty("es.set.netty.runtime.available.processors", "false");

//TODO 文章未完,待续