学成在线day11,全文检索 Elasticearch- 搜索管理的11个方法,部署ES集群的步骤,学成_搜索服务,win系统的Logstash的安装测试,课程搜索

搜索管理的javaAPI方法:几乎都常用

测试类依赖的jar

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.naming.directory.SearchResult;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestSearch {
   

    @Autowired
    RestHighLevelClient client;

    @Autowired
    RestClient restClient;

1.搜索全部记录 matchAllQuery 查询所有索引库的文档。

   @Test
    //搜索全部记录
    public void testSearchAll() throws IOException, ParseException {
   
        //新建一个搜索请求的对象,指向ES中xc_course这张表
        SearchRequest searchRequest = new SearchRequest("xc_course");
        //指定表的类型,就是那个无意义的type,字段
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //指定搜索源的搜索方式
        //matchAllQuery搜索全部
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{
   "name","studymodel","price","timestamp"},new String[]{
   });
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求,搜索时通过io流去操作,所以需要抛IO异常
            //得到结果
        SearchResponse searchResponse = client.search(searchRequest);
        //把结果解析
        SearchHits hits = searchResponse.getHits();
        //取匹配到的结果总记录数
        long totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //先创建日期格式化对象
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //遍历高度匹配的文档
        for (SearchHit hit : searchHits) {
   
            //文档的主键
            String id = hit.getId();
            //源文档内容,源中的数据,封装为map返回
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                //取name这个列的数据,里面的数据你知道是String,所以Object可以强转
                String name = (String)sourceAsMap.get("name");
                //由于前边设置了源文档字段过虑,这时description是取不到的
                String description = (String) sourceAsMap.get("description");
                //学习模式
                String studymodel = (String) sourceAsMap.get("studymodel");
                //价格
                Double price = (Double) sourceAsMap.get("price");
                //日期,(String)sourceAsMap.get("timestamp")是取得一个时间字符串
                    // ,需要提前准备好的日期格式化对象,并且抛日期的异常
            Date timestamp = simpleDateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.err.println(name);
            System.err.println(studymodel);
            System.err.println(description);
        }
    }//搜索全部记录

2.分页查询 搜索源设置分页参数
ES支持分页查询,传入两个参数:from和size。
form:表示起始文档的下标,从0开始。
size:查询的文档数量。

  @Test
    //2.分页查询
    public void testSearchPage() throws IOException, ParseException {
   
        //新建一个搜索请求的对象,指向ES中xc_course这张表
        SearchRequest searchRequest = new SearchRequest("xc_course");
        //指定表的类型,就是那个无意义的type,字段
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //设置分页参数
        //页码
        int page = 1;
        //每页记录数
        int size = 1;
        //计算出记录起始下标
        int from  = (page-1)*size;
        //起始记录下标,从0开始
        searchSourceBuilder.from(from);
        //每页显示的记录数
        searchSourceBuilder.size(size);

        //指定搜索源的搜索方式
        //matchAllQuery搜索全部
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{
   "name","studymodel","price","timestamp"},new String[]{
   });
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求,搜索时通过io流去操作,所以需要抛IO异常
        //得到结果
        SearchResponse searchResponse = client.search(searchRequest);
        //把结果解析
        SearchHits hits = searchResponse.getHits();
        //取匹配到的结果总记录数
        long totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //先创建日期格式化对象
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //遍历高度匹配的文档
        for (SearchHit hit : searchHits) {
   
            //文档的主键
            String id = hit.getId();
            //源文档内容,源中的数据,封装为map返回
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            //取name这个列的数据,里面的数据你知道是String,所以Object可以强转
            String name = (String)sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期,(String)sourceAsMap.get("timestamp")是取得一个时间字符串
            // ,需要提前准备好的日期格式化对象,并且抛日期的异常
            Date timestamp = simpleDateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.err.println(name);
            System.err.println(studymodel);
            System.err.println(description);
            System.err.println("搜索到条数:"+totalHits);
        }
    }//分页搜索结束

3.TermQuery,精确查询某个列(常用)

	@Test
	public void testTermQuery() throws IOException, ParseException {
   
    //新建一个搜索请求的对象,指向ES中xc_course这张表
    SearchRequest searchRequest = new SearchRequest("xc_course");
    //指定表的类型,就是那个无意义的type,字段
    searchRequest.types("doc");
    //搜索源构建对象
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    //设置分页参数
    //页码
    int page = 1;
    //每页记录数
    int size = 1;
    //计算出记录起始下标
    int from  = (page-1)*size;
    //起始记录下标,从0开始
    searchSourceBuilder.from(from);
    //每页显示的记录数
    searchSourceBuilder.size(size);

    //指定搜索源的搜索方式
    //搜索方式
    //******termQuery,精确查询某个列,内容为spring的字符*******
    searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));


    //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
    searchSourceBuilder.fetchSource(new String[]{
   "name","studymodel","price","timestamp"},new String[]{
   });
    //向搜索请求对象中设置搜索源
    searchRequest.source(searchSourceBuilder);
    //执行搜索,向ES发起http请求,搜索时通过io流去操作,所以需要抛IO异常
    //得到结果
    SearchResponse searchResponse = client.search(searchRequest);
    //把结果解析
    SearchHits hits = searchResponse.getHits();
    //取匹配到的结果总记录数
    long totalHits = hits.getTotalHits();
    //得到匹配度高的文档
    SearchHit[] searchHits = hits.getHits();
    //先创建日期格式化对象
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //遍历高度匹配的文档
    for (SearchHit hit : searchHits) {
   
        //文档的主键
        String id = hit.getId();
        //源文档内容,源中的数据,封装为map返回
        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
        //取name这个列的数据,里面的数据你知道是String,所以Object可以强转
        String name = (String)sourceAsMap.get("name");
        //由于前边设置了源文档字段过虑,这时description是取不到的
        String description = (String) sourceAsMap.get("description");
        //学习模式
        String studymodel = (String) sourceAsMap.get("studymodel");
        //价格
        Double price = (Double) sourceAsMap.get("price");
        //日期,(String)sourceAsMap.get("timestamp")是取得一个时间字符串
        // ,需要提前准备好的日期格式化对象,并且抛日期的异常
        Date timestamp = simpleDateFormat.parse((String) sourceAsMap.get("timestamp"));
        System.err.println(name);
        System.err.println(studymodel);
        System.err.println(description);
        System.err.println("搜索到条数:"+totalHits);
    }
}

4.TermsQuery 根据id精确匹配(常用)

@Test
	public void testTermQueryByIds() throws IOException, ParseException {
   
    //新建一个搜索请求的对象,指向ES中xc_course这张表
    SearchRequest searchRequest = new SearchRequest("xc_course");
    //指定表的类型,就是那个无意义的type,字段
    searchRequest.types("doc");
    //搜索源构建对象
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    //设置分页参数
    //页码
    int page = 1;
    //每页记录数
    int size = 5;
    //计算出记录起始下标
    int from  = (page-1)*size;
    //起始记录下标,从0开始
    searchSourceBuilder.from(from);
    //每页显示的记录数
    searchSourceBuilder.size(size);


    //指定搜索源的搜索方式
    //搜索方式
    //根据id查询
    //*******定义id数组*******
    String[] ids = new String[]{
   "1","2"};
    //通过    _id  这个列,查询数组内的所有id,返回符合的数据
        //*******termsQuery,注意这个方法,比列精确查询多个s。要注意看*******
    searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));
    
    
    //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
    searchSourceBuilder.fetchSource(new String[]{
   "name","studymodel","price","timestamp"},new String[]{
   });
    //向搜索请求对象中设置搜索源
    searchRequest.source(searchSourceBuilder);
    //执行搜索,向ES发起http请求,搜索时通过io流去操作,所以需要抛IO异常
    //得到结果
    SearchResponse searchResponse 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值