Elasticsearch(四)

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实现搜索建议并将结果进行高亮显示

搜索框---可以进行搜索建议

表格对内容进行高亮显示

数据来源:下厨房

实现美食的搜索建议,并对搜索的结果进行卡片化显示,同时对查询关键字进行高亮显示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cjy_行业报告

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值