3.4 Spring Data Elasticsearch
中小型企业常用的就是框架,Spring Data Elasticsearch,就是Spring体系基于Transport的封装,简化了操作ES的难度,操作es就跟操作数据库一样
实现步骤:
1.依赖jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.实现配置
application.yml配置 连接es服务器
spring:
elasticsearch:
rest:
uris: 39.105.189.141:9200
3.编写代码
三层
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "es2008")//标记对应的索引名称
public class Student {
private Integer id;
private String name;
private String sex;//性别
}
public interface StudentDao extends ElasticsearchRepository<Student,Integer> {
}
public interface StudentService {
String save(Student student);
Iterable<Student> all();
}
@Service
public class StudentServiceImpl implements StudentService{
@Autowired
private StudentDao dao;
@Override
public String save(Student student) {
if(dao.save(student)!=null){
return "新增成功";
}else {
return "新增失败";
}
}
@Override
public Iterable<Student> all() {
return dao.findAll();
}
}
4.单元测试
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = EsApplication.class)
public class EsTest {
@Autowired
private StudentService studentService;
@Test
public void t1(){
Student student=new Student(1,"小王");
System.err.println(studentService.save(student));
}
@Test
public void t2(){
studentService.all().forEach((s)-> System.err.println(s));
}
}
四、Elasticsearch进阶
4.1 Elasticsearch批处理
基于es实现批量的操作,比如批量新增、批量修改、批量删除
核心代码:
//1.实例化客户端对象 连接服务器
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("39.105.189.141",
9200, "http")));
//Es可以实现批量操作,方便快速进行同步数据
BulkRequest request=new BulkRequest();
//批量新增
for(int i=101;i<1000;i++){
//DeleteRequest
//UpdateRequest
//IndexRequest
request.add(new IndexRequest("es2008").id(i+"").source(
JSON.toJSONString(new Student(i,"批量-"+i,"man")),XContentType.JSON));
}
//执行批处理
BulkResponse responses=client.bulk(request,RequestOptions.DEFAULT);
System.err.println(responses.status().toString());
//3.关闭
client.close();
4.2 各种查询
1.TermQueryBuilder:
词条查询是ElasticSearch的一个简单查询。它仅匹配在给定字段中含有该词条的文档,而且是确切的、未经分析的词条。term查询会查找我们设定的准确值。term查询本身很简单,它接受一个字段名和我们希望查找的值.MatchQueryBuilder(MatchQueryBuilder输入的词条会被es解析并进行分词,在此过程中就已经转换成全小写)查询效果一样
命令模式:
POST es2008/_search
{
"from": 0,
"size": 5,
"query": {
"term": {
"name": {
"value": "批量-101"
}
}
}
}
代码模式:
TermQueryBuilder termQuery=QueryBuilders.termQuery("sex","man");
2.TermsQueryBuilder:
词条查询(Term Query)允许匹配单个未经分析的词条,多词条查询(Terms Query)可以用来匹配多个这样的词条。只要指定字段包含任一我们给定的词条,就可以查询到该文档。
3.RangeQueryBuilder:
范围查询,比如数字类型、日期类型等的范围查询:gt gte lt lte
命令模式:
代码模式:
操作符 | 说明 |
gt | 大于 |
gte | 大于等于 |
lt | 小于 |
lte | 小于等于 |
RangeQueryBuilder rangeQuery=QueryBuilders.rangeQuery("id");
rangeQuery.lt(200).gte(122);
4.WildcardQueryBuilder:
通配符查询,?匹配单个字符,*匹配多个字符,请注意,此查询可能会很慢,因为它需要遍历许多项。
//3.通配符查询 *任意个字符 ?单个字符
WildcardQueryBuilder wildcardQuery=QueryBuilders.wildcardQuery("name","*8");
5.FuzzyQueryBuilder:
模糊查询,可以使用%进行模糊,还可以指定前缀字符模糊匹配
对于中文的模糊搜索,应该先安装中文分词,比如IK分词器
我爱北京天安门
我 我爱 北京 我爱北京 天安门 北京天安门 爱北京天安门
//5.模糊查询 % super supzr
FuzzyQueryBuilder fuzzyQuery=QueryBuilders.fuzzyQuery("name","批量-232");
fuzzyQuery.prefixLength(4);//设置固定前缀匹配
6.BoolQueryBuilder:
布尔查询,拼接多个查询条件
常见的拼接关系:
must:必须 同时满足 类似 and
must_not:必须不 不能满足
should:应该 只有有一个满足即可 类似 or
filter:过滤 就是must替代品 只能进行数据筛选,进行额外操作
//6.布尔查询 拼接查询条件
BoolQueryBuilder boolQuery=QueryBuilders.boolQuery();
// boolQuery.should();
// boolQuery.mustNot();
// boolQuery.filter();
boolQuery.must(termQuery).must(rangeQuery);
基于Transport实现查询核心代码:
public static void main(String[] args) throws IOException {
//1.实例化客户端对象 连接服务器
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("39.105.189.141",
9200, "http")));
//es 查询 的复杂
SearchRequest request=new SearchRequest("es2008");
//构建查询对象
//1.精确查询
TermQueryBuilder termQuery=QueryBuilders.termQuery("sex","man");
//2.范围查询
RangeQueryBuilder rangeQuery=QueryBuilders.rangeQuery("id");
rangeQuery.lt(200).gte(122);
//3.通配符查询 *任意个字符 ?单个字符
WildcardQueryBuilder wildcardQuery=QueryBuilders.wildcardQuery("name","*8");
//4.全部查询
MatchAllQueryBuilder matchAllQuery=QueryBuilders.matchAllQuery();
//5.模糊查询 % super supzr
FuzzyQueryBuilder fuzzyQuery=QueryBuilders.fuzzyQuery("name","批量-232");
fuzzyQuery.prefixLength(4);//设置固定前缀匹配
//FuzzyLikeThisQueryBuilder builder;
//6.布尔查询 拼接查询条件
BoolQueryBuilder boolQuery=QueryBuilders.boolQuery();
// boolQuery.should();
// boolQuery.mustNot();
// boolQuery.filter();
boolQuery.must(termQuery).must(rangeQuery);
SearchSourceBuilder builder=new SearchSourceBuilder();
//设置生效的查询对象
builder.query(fuzzyQuery);
builder.from(1).size(100).sort("id", SortOrder.DESC);
request.source(builder);
SearchResponse response=client.search(request,RequestOptions.DEFAULT);
//获取查询的结果
SearchHits hits=response.getHits();
SearchHit[] hitarr=hits.getHits();
for(SearchHit sh:hitarr){
System.err.println(sh.getSourceAsString());
}
//3.关闭
client.close();
}
基于Spring Data Elasticsearch实现各种查询
@SpringBootTest
public class EsTest {
@Autowired
private ElasticsearchRestTemplate restTemplate;
//范围查询
@Test
public void t1(){
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.rangeQuery("money").from(300).to(3000)).build();
List<SearchHit<Worker>> workers=restTemplate.search(searchQuery, Worker.class,IndexCoordinates.of("lxes2011")).getSearchHits();
System.err.println(workers);
}
//词条查询(精确查询)
@Test
public void t2(){
//词条查询
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.termQuery("company","pdd")).build();
//分页查询
searchQuery.setPageable(PageRequest.of(2,100, Sort.by(Sort.Order.desc("id"))));
List<SearchHit<Worker>> workers=restTemplate.search(searchQuery, Worker.class,IndexCoordinates.of("lxes2011")).getSearchHits();
System.err.println(workers);
}
//模糊查询
@Test
public void t3(){
//模糊查询
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.fuzzyQuery("name","88")).build();
//分页查询
searchQuery.setPageable(PageRequest.of(2,100, Sort.by(Sort.Order.desc("id"))));
List<SearchHit<Worker>> workers=restTemplate.search(searchQuery, Worker.class,IndexCoordinates.of("lxes2011")).getSearchHits();
System.err.println(workers);
}
//通配符查询
@Test
public void t4(){
//通配符查询 *任意字符 ?单个字符
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.wildcardQuery("name","*88*")).build();
//分页查询
searchQuery.setPageable(PageRequest.of(2,100, Sort.by(Sort.Order.desc("id"))));
List<SearchHit<Worker>> workers=restTemplate.search(searchQuery, Worker.class,IndexCoordinates.of("lxes2011")).getSearchHits();
System.err.println(workers);
}
}
4.3 搜索建议&高亮显示
需求:基于ESs实现搜索建议并将结果进行高亮显示
搜索框---可以进行搜索建议
表格对内容进行高亮显示
数据来源:下厨房
实现美食的搜索建议,并对搜索的结果进行卡片化显示,同时对查询关键字进行高亮显示