Spring Data是一个用于数据库访问,并支持云服务的开源框架,其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA的写法。可以在几乎不用写实现的情况下,实现对数据的访问和操作,除了CRUD外,还包括分页。排序等一些常用的功能
官网:http://projects.spring.io/spring-data/
pom.xml
<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>
<denpendency>
<groupId>com.fasterxml.jackson.core</groupId>
<articleId>jackson</articleId>
<version>2.8.1</version>
</dependency>
<denpendency>
<groupId>com.fasterxml.jackson.core</groupId>
<articleId>jackson-databind</articleId>
<version>2.8.1</version>
</dependency>
<denpendency>
<groupId>com.fasterxml.jackson.core</groupId>
<articleId>jackson-annotations</articleId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<exclusion>
<exclusions>
<dependency>
1.创建Entity类,pojo
@Document(indexName = "index_hello",type="article")#索引
@Data
public class Article{
@ID
@Field(type=FieldType.long,store = true)
private long id;
@Field(type=FieldType.text,store = true, analyzer = "ik_smart")
private String title;
@Field(type=FieldType.text,store = true, analyzer = "ik_smart")
private String content;
}
2.创建一个Dao,是一个接口,需要继承ElasticSearchRepository接口
public interface ArticleRepository extends ElasticsearchRepository<Article,Long>{
}
SpringDataEs创建索引
public class SpringDataElasticSearchTest{
@Autowired
private ArticleRepository articleRepository;
@Autowired
private ElasticsearchTemplate template;
public void createIndex(){
//创建索引,并配置映射关系
template.createIndex(Article.class);
//配置映射关系
template.putMapping(Article.class);
}
public void addDocument(){
Article article = new Article();
article.setId(1);
article.setTitle("我是程序员");
article.setContent("修改bug");
//把文档写入索引库
articleRepository.save(article);
}
public void deleteDocument(){
articleRepository.deleteById(1);//删除id为1的
articleRepository.deleteAll();//全部删除
}
public void updateDocument(){
Article article = new Article();
article.setId(1);
article.setTitle("我是程序员");
article.setContent("aaa");
//把文档写入索引库
articleRepository.save(article);
}
public void searchDocument(){
articleRepository.findAll();//返回所有的
articleRepository.findById(1);//查询id为1的
}
//自定义查询
public interface ArticleRepository extends ElasticsearchRepository<Article,Long>{
List<Article> findByTitle(String title);//定义好即可 无需实现
List<Article> findByTitleOrContent(String title, String content);
List<Article> findByTitleOrContent(String title, String content,Pageable pageable);//设置分页
}
public void findDocument(){
articleRepository.findByTitle("程序员");
articleRepository.findByTitleOrContent("程序员","a");//不分页默认是10条数据
#分词查询 分词与分词之间是and关系
Pageable pageable = PageRequest.of(0,5);
articleRepository.findByTitleOrContent("程序员","a");//这个时候就会分页
}
}
使用NativeSearchQuery 查询
1.创建一个NativeSearchQuery对象
设置查询条件,QueryBuilder对象
NativeSearchQueryBuilder query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery("程序员").defaultField("title"))
//根据实际情况查询 分词关系是或
.withPageable(PageRequest.of(0,10))//分页
.build();
2.使用ElasticSearchTemplate对象执行查询
List<Article> articleList = template.queryForList(query,Article.class);
3.取查询结果
分片参数设置:
https://blog.csdn.net/qq_38486203/article/details/80077844
number_of_shards:主分片数,默认为1
number_of_replicas:副本分片数,默认为1
可以在线修改副本分片数 number_of_replicas ,但主分片数 number_of_shards 不可以在线改
curl -XPUT 'http://localhost:9200/myindex/_settings' -H 'Content-Type: application/json' -d '
{
"index" : {
"number_of_replicas" : 0
}
}
也可以在配置文件 elasticsearch.yml 中进行修改:
index.number_of_shards:
设置默认索引分片个数,默认为1片。索引分片对ES的查询性能有很大的影响,在应用环境,应该选择适合的分片大小。
index.number_of_replicas:
设置默认索引副本个数,默认为1个副本。此处的1个副本是指index.number_of_shards的一个完全拷贝;如果有5个主分片1个副本分片,即总分片数为10。