1.Elasticsearch介绍和安装
用户访问我们的首页,一般都会直接搜索来寻找自己想要购买的商品。
而商品的数量非常多,而且分类繁杂。如何能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。
面对这样复杂的搜索业务和数据量,使用传统数据库搜索就显得力不从心,一般我们都会使用全文检索技术,比如之前大家学习过的Solr。
不过今天,我们要讲的是另一个全文检索技术:Elasticsearch。
这个照着笔记和视频上的流程基本都可以顺利安装
后面就是安装IK分词器,安装kibana都是比较容易的
启动成功:
案例测试:
查询总结:
3.3 高级查询
3.3.1 布尔组合(bool)
3.3.2 范围查询(range)
range
查询找出那些落在指定区间内的数字或者时间
3.5 排序
3.4.1 单字段排序
sort
可以让我们按照不同的字段进行排序,并且通过order
指定排序的方式
4. 聚合aggregations
聚合可以让我们极其方便的实现对数据的统计、分析。例如:
-
什么品牌的手机最受欢迎?
-
这些手机的平均价格、最高价格、最低价格?
-
这些手机每月的销售情况如何?
实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现实时搜索效果。
创建测试工程:
引入依赖及其相对应得配置文件信息
spring:
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 192.168.1.99:9300
测试Demo使用Java程序控制Elasticsearch
@SpringBootTest(classes = elasticsearchApplication.class)
@RunWith(SpringRunner.class)
public class ElasticsearchTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void testIndex(){
this.elasticsearchTemplate.createIndex(Item.class);
this.elasticsearchTemplate.putMapping(Item.class);
}
}
完成测试:
使用模板进行新增和更新操作
完成测试:
查询方法:
@Test
public void testquery(){
Optional<Item> byId = repository.findById(1l);
System.out.println(byId);
}
完成测试:
查询全部
@Test
public void testquery(){
Optional<Item> byId = repository.findById(1l);
Iterable<Item> items = repository.findAll(Sort.by("price").descending());
for (Item item : items) {
System.out.println(item);
}
}
完成测试:
自定义方法查询:
@Test
public void testTitle(){
List<Item> items = this.repository.findByTitle("手机");
for (Item item : items) {
System.out.println(item);
}
}
高级查询:通过查询构建器来执行查询
@Test
public void testQuey(){
MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "手机");
Iterable<Item> search = this.repository.search(queryBuilder);
search.forEach(System.out::println);
}
完成测试:
高级查询:
public void gaojiTestQuey(){
NativeSearchQueryBuilder queryBuilder=new NativeSearchQueryBuilder();
queryBuilder.withQuery(QueryBuilders.matchQuery("title","手机"));
Page<Item> items = this.repository.search(queryBuilder.build());
items.forEach(System.out::println);
}
分页查询:
@Test
public void PageTest(){
NativeSearchQueryBuilder queryBuilder=new NativeSearchQueryBuilder();
queryBuilder.withPageable(PageRequest.of(1,2));
Page<Item> items = this.repository.search(queryBuilder.build());
items.forEach(System.out::println);
}
排序查询:
@Test
public void SortTest(){
NativeSearchQueryBuilder nativeSearchQueryBuilder=new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
Page<Item> items = this.repository.search(nativeSearchQueryBuilder.build());
System.out.println(items.getContent());
}
完成测试: