前言:
Elasticsearch是一个基于Lucene的搜索服务器,他提供了一个分布式多用户能力的全文搜索引擎。Elasticsearch本身就是集群的,默认有5个分片。
org.springframework.boot
spring-boot-starter-data-elasticsearch
spring:
data:
elasticsearch:
cluster-name: my-application //ElasticSearch的名字
cluster-nodes: 127.0.0.1:9300
@Data
@AllArgsConstructor
//第一个参数:索引库名字
//第二个参数:类型名称
@Document(indexName = "skus01", type = "goods")
public class Item {
public Item() {
}
@Id
private Long id;
//标题需要分词,所以类型为Text,指定ik分词器
@Field(type = FieldType.Text,analyzer = "ik_max_word")
private String title;
//分类不需要分词,所以指定为keyword类型,代表只索引,不分词
@Field(type = FieldType.Keyword)
private String category;// 分类
@Field(type = FieldType.Keyword)
private String brand; // 品牌
//价格为Double类型
@Field(type = FieldType.Double)
private Double price; // 价格
//图片地址不需要索引,不需要分词
@Field(type = FieldType.Keyword,index = false)
private String images; // 图片地址
}
注意:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ElasticsearchTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void createIndex(){
//创建索引
elasticsearchTemplate.createIndex(Item.class);
//建立映射
elasticsearchTemplate.putMapping(Item.class);
}
}
Repository接口
Spring Data 的强大之处,就在于你不用写任何DAO处理,自动根据方法名或类的信息进行CRUD 操作。只要你定义一个接口,然后继承Repository提供的一些子接口,就能具备各种基本的CRUD功 能。
public interface ItemRepositroy extends ElasticsearchRepository- {}
添加数据:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ElasticsearchTest {
//注入刚刚自定义的接口对象
@Autowired
private ItemRepositroy itemRepositroy;
@Test
public void saveIndex(){
Item item3 = new Item(4l,"小米手机11pro1","手机","小米",3999.0,"https://img14.360buyimg.com/n1/s450x450_jfs/t1/65786/38/8555/351173/5d674913E0a3b51f6/8d2e3fadc4cfac3c.jpg");
Item item4 = new Item(5l,"坚果手机51","手机","锤子",999.0,"https://img14.360buyimg.com/n1/s450x450_jfs/t1/65786/38/8555/351173/5d674913E0a3b51f6/8d2e3fadc4cfac3c.jpg");
itemRepositroy.save(item3);
itemRepositroy.save(item4);
}
}
方式一:
@Test
public void selectIndex(){
Iterable- all = itemRepositroy.findAll();
Iterator
- iterator = all.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
方式二:
自定义方法:
public interface ItemRepositroy extends ElasticsearchRepository- {
public List
- findByTitle(String title);
}
@Test
public void selectIndex(){
List- list = itemRepositroy.findByTitle("手机");
for (Item item : list) {
System.out.println(item);
}
}
方式三:
自定义查询:
@Test
public void queryIndex(){
//创建查询构建器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.withQuery(QueryBuilders.matchQuery("title","小米手机"));
Page- search = itemRepositroy.search(queryBuilder.build());
for (Item item : search) {
System.out.println(item);
}
}