首页 > 编程语言 >Elasticsearch——java api构建搜索

Elasticsearch——java api构建搜索

时间:2022-10-14 17:07:39浏览次数:43  
标签:java String description System name api Elasticsearch println out

版本

不同版本的elasticsearch-rest-high-level-client和 elasticsearch之间存在兼容风险,请确保和elasticsearch版本一致,否则会出现无法预计的错误。

es配置

maven依赖

<dependency>
	<groupId>org.elasticsearch.client</groupId>
	<artifactId>elasticsearch-rest-high-level-client</artifactId>
	<version>7.3.0</version>
	<exclusions>
		<exclusion>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.elasticsearch</groupId>
	<artifactId>elasticsearch</artifactId>
	<version>7.3.0</version>
</dependency>

配置application.properties

spring.application.name=service-search

#多个节点用逗号隔开
elasticsearch.hostlist=127.0.0.1:9200

创建配置类ElasticsearchConfig

@Configuration
public class ElasticsearchConfig {

    @Value("${elasticsearch.hostlist}")
    private String hostlist;

    @Bean(destroyMethod = "close")
    public RestHighLevelClient restHighLevelClient(){
        String[] split = hostlist.split(",");
        HttpHost[] httpHost = new HttpHost[split.length];
        for (int i = 0; i < split.length; i++) {
            String[] item = split[i].split(":");
            httpHost[i] = new HttpHost(item[0],Integer.parseInt(item[1]),"http");
        }
        return new RestHighLevelClient(RestClient.builder(httpHost));
    }
}

搜索测试代码

搜索全部记录

GET /book/_search
{
  "query": {
    "match_all": {}
  }
}
@SpringBootTest(classes = SearchApplication.class)
@RunWith(SpringRunner.class)
@Slf4j
public class TestSearch {

    @Autowired
    private RestHighLevelClient client;

    //搜索全部记录
    @Test
    public void testSearchAll() throws IOException {
        //1、构建搜索请求
        SearchRequest searchRequest = new SearchRequest("book");

        //构建搜索的请求体
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        //获取某些字段
        searchSourceBuilder.fetchSource(new String[]{"name"},new String[]{});

        searchRequest.source(searchSourceBuilder);

        //2、执行
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        //3、获取结果
        SearchHits searchHits = searchResponse.getHits();
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String id = hit.getId();
            float score = hit.getScore();
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String)sourceAsMap.get("name");
            String description = (String)sourceAsMap.get("description");
            Double price = (Double)sourceAsMap.get("price");
            System.out.println("id: "+id);
            System.out.println("score: "+score);
            System.out.println("name: "+name);
            System.out.println("description: "+description);
            System.out.println("price: "+price);
            System.out.println("---------------------------------");
        }
    }
}

分页搜索

GET /book/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 2
}
@Test
public void testSearchPage() throws IOException {
	//1、构建搜索请求
	SearchRequest searchRequest = new SearchRequest("book");

	//构建搜索的请求体
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	searchSourceBuilder.query(QueryBuilders.matchAllQuery());
	//设置分页
	int page = 1;//当前页
	int size = 2;//每页显示记录数
	int from  = (page - 1) * size;//每页起始记录数计算
	searchSourceBuilder.from(from).size(size);


	//获取某些字段
	searchSourceBuilder.fetchSource(new String[]{"name"},new String[]{});

	searchRequest.source(searchSourceBuilder);

	//2、执行
	SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

	//3、获取结果
	SearchHits searchHits = searchResponse.getHits();
	SearchHit[] hits = searchHits.getHits();
	for (SearchHit hit : hits) {
		String id = hit.getId();
		float score = hit.getScore();
		Map<String, Object> sourceAsMap = hit.getSourceAsMap();
		String name = (String)sourceAsMap.get("name");
		String description = (String)sourceAsMap.get("description");
		Double price = (Double)sourceAsMap.get("price");
		System.out.println("id: "+id);
		System.out.println("score: "+score);
		System.out.println("name: "+name);
		System.out.println("description: "+description);
		System.out.println("price: "+price);
		System.out.println("---------------------------------");
	}
}

ids搜索

GET /book/_search
{
  "query": {
    "ids" : {
      "values" : ["1", "4", "100"]
    }
  }
}
@Test
public void testSearchIds() throws IOException {
	//1、构建搜索请求
	SearchRequest searchRequest = new SearchRequest("book");

	//构建搜索的请求体
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	searchSourceBuilder.query(QueryBuilders.idsQuery().addIds("1","4","100"));

	searchRequest.source(searchSourceBuilder);

	//2、执行
	SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

	//3、获取结果
	SearchHits searchHits = searchResponse.getHits();
	SearchHit[] hits = searchHits.getHits();
	for (SearchHit hit : hits) {
		String id = hit.getId();
		float score = hit.getScore();
		Map<String, Object> sourceAsMap = hit.getSourceAsMap();
		String name = (String)sourceAsMap.get("name");
		String description = (String)sourceAsMap.get("description");
		Double price = (Double)sourceAsMap.get("price");
		System.out.println("id: "+id);
		System.out.println("score: "+score);
		System.out.println("name: "+name);
		System.out.println("description: "+description);
		System.out.println("price: "+price);
		System.out.println("---------------------------------");
	}
}

按关键词搜索matchQuery

GET /book/_search
{
  "query" : {
    "match" : {
      "description" : "java程序员"
    }
  }
}
@Test
public void testSearchMatch() throws IOException {
	//1、构建搜索请求
	SearchRequest searchRequest = new SearchRequest("book");

	//构建搜索的请求体
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	searchSourceBuilder.query(QueryBuilders.matchQuery("description","java程序员"));

	searchRequest.source(searchSourceBuilder);

	//2、执行
	SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

	//3、获取结果
	SearchHits searchHits = searchResponse.getHits();
	SearchHit[] hits = searchHits.getHits();
	for (SearchHit hit : hits) {
		String id = hit.getId();
		float score = hit.getScore();
		Map<String, Object> sourceAsMap = hit.getSourceAsMap();
		String name = (String)sourceAsMap.get("name");
		String description = (String)sourceAsMap.get("description");
		Double price = (Double)sourceAsMap.get("price");
		System.out.println("id: "+id);
		System.out.println("score: "+score);
		System.out.println("name: "+name);
		System.out.println("description: "+description);
		System.out.println("price: "+price);
		System.out.println("---------------------------------");
	}
}

multi_match搜索

GET /book/_search
{
  "query": {
    "multi_match": {
      "query": "java程序员",
      "fields": ["name", "description"]
    }
  }
}
@Test
public void testSearchMultiMatch() throws IOException {
	//1、构建搜索请求
	SearchRequest searchRequest = new SearchRequest("book");

	//构建搜索的请求体
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	searchSourceBuilder.query(QueryBuilders.multiMatchQuery("java程序员","name","description"));

	searchRequest.source(searchSourceBuilder);

	//2、执行
	SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

	//3、获取结果
	SearchHits searchHits = searchResponse.getHits();
	SearchHit[] hits = searchHits.getHits();
	for (SearchHit hit : hits) {
		String id = hit.getId();
		float score = hit.getScore();
		Map<String, Object> sourceAsMap = hit.getSourceAsMap();
		String name = (String)sourceAsMap.get("name");
		String description = (String)sourceAsMap.get("description");
		Double price = (Double)sourceAsMap.get("price");
		System.out.println("id: "+id);
		System.out.println("score: "+score);
		System.out.println("name: "+name);
		System.out.println("description: "+description);
		System.out.println("price: "+price);
		System.out.println("---------------------------------");
	}
}

bool搜索

GET /book/_search
{
  "query": {
    "bool" : {
      "must" : [
        {
          "multi_match": {
            "query": "java程序员",
            "fields": ["name","description"]
          }
        }  
      ],
      "should" : [
        {
          "match": {
            "studymodel": "201001"
          }
        }
      ]
    }
  }
}
@Test
public void testSearchBool() throws IOException {
	//1、构建搜索请求
	SearchRequest searchRequest = new SearchRequest("book");

	//构建搜索的请求体
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	//构建multi_match请求
	MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("java程序员", "name", "description");
	//构建match请求
	MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("studymodel", "201001");
	//构建bool请求
	BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
	boolQueryBuilder.must(multiMatchQueryBuilder);
	boolQueryBuilder.should(matchQueryBuilder);
	searchSourceBuilder.query(boolQueryBuilder);

	searchRequest.source(searchSourceBuilder);

	//2、执行
	SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

	//3、获取结果
	SearchHits searchHits = searchResponse.getHits();
	SearchHit[] hits = searchHits.getHits();
	for (SearchHit hit : hits) {
		String id = hit.getId();
		float score = hit.getScore();
		Map<String, Object> sourceAsMap = hit.getSourceAsMap();
		String name = (String)sourceAsMap.get("name");
		String description = (String)sourceAsMap.get("description");
		Double price = (Double)sourceAsMap.get("price");
		System.out.println("id: "+id);
		System.out.println("score: "+score);
		System.out.println("name: "+name);
		System.out.println("description: "+description);
		System.out.println("price: "+price);
		System.out.println("---------------------------------");
	}
}

filter搜索

GET /book/_search
{
  "query": {
    "bool" : {
      "must" : [
        {
          "multi_match": {
            "query": "java程序员",
            "fields": ["name","description"]
          }
        }  
      ],
      "should" : [
        {
          "match": {
            "studymodel": "201001"
          }
        }
      ],
      "filter": {
        "range": {
          "price": {
            "gte": 50,
            "lte": 90
          }
        }
      }
    }
  }
}
@Test
public void testSearchFilter() throws IOException {
	//1、构建搜索请求
	SearchRequest searchRequest = new SearchRequest("book");

	//构建搜索的请求体
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	//构建multi_match请求
	MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("java程序员", "name", "description");
	//构建match请求
	MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("studymodel", "201001");
	//构建bool请求
	BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
	boolQueryBuilder.must(multiMatchQueryBuilder);
	boolQueryBuilder.should(matchQueryBuilder);
	boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(50).lte(90));
	searchSourceBuilder.query(boolQueryBuilder);

	searchRequest.source(searchSourceBuilder);

	//2、执行
	SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

	//3、获取结果
	SearchHits searchHits = searchResponse.getHits();
	SearchHit[] hits = searchHits.getHits();
	for (SearchHit hit : hits) {
		String id = hit.getId();
		float score = hit.getScore();
		Map<String, Object> sourceAsMap = hit.getSourceAsMap();
		String name = (String)sourceAsMap.get("name");
		String description = (String)sourceAsMap.get("description");
		Double price = (Double)sourceAsMap.get("price");
		System.out.println("id: "+id);
		System.out.println("score: "+score);
		System.out.println("name: "+name);
		System.out.println("description: "+description);
		System.out.println("price: "+price);
		System.out.println("---------------------------------");
	}
}

sort搜索

GET /book/_search
{
  "query": {
    "bool" : {
      "must" : [
        {
          "multi_match": {
            "query": "java程序员",
            "fields": ["name","description"]
          }
        }  
      ],
      "should" : [
        {
          "match": {
            "studymodel": "201001"
          }
        }
      ],
      "filter": {
        "range": {
          "price": {
            "gte": 50,
            "lte": 90
          }
        }
      }
    }
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ] 
}
@Test
public void testSearchSort() throws IOException {
	//1、构建搜索请求
	SearchRequest searchRequest = new SearchRequest("book");

	//构建搜索的请求体
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
	//构建multi_match请求
	MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("java程序员", "name", "description");
	//构建match请求
	MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("studymodel", "201001");
	//构建bool请求
	BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
	boolQueryBuilder.must(multiMatchQueryBuilder);
	boolQueryBuilder.should(matchQueryBuilder);
	boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(50).lte(90));
	searchSourceBuilder.query(boolQueryBuilder);
	//按照价格字段升序排序
	searchSourceBuilder.sort("price", SortOrder.ASC);

	searchRequest.source(searchSourceBuilder);

	//2、执行
	SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

	//3、获取结果
	SearchHits searchHits = searchResponse.getHits();
	SearchHit[] hits = searchHits.getHits();
	for (SearchHit hit : hits) {
		String id = hit.getId();
		float score = hit.getScore();
		Map<String, Object> sourceAsMap = hit.getSourceAsMap();
		String name = (String)sourceAsMap.get("name");
		String description = (String)sourceAsMap.get("description");
		Double price = (Double)sourceAsMap.get("price");
		System.out.println("id: "+id);
		System.out.println("score: "+score);
		System.out.println("name: "+name);
		System.out.println("description: "+description);
		System.out.println("price: "+price);
		System.out.println("---------------------------------");
	}
}

标签:java,String,description,System,name,api,Elasticsearch,println,out
From: https://blog.51cto.com/u_14014612/5757471

相关文章

  • Elasticsearch——评分机制详解
    前言一个搜索引擎使用的时候必定需要排序这个模块,如果在不选择按照某一字段排序的情况下,都是按照打分的高低进行一个默认排序的,所以如果正式使用的话,必须对默认排序的打分......
  • Elasticsearch——聚合搜索
    聚合分析简介聚合分析:英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能。功能丰富,提供Bucket、Metric、Pipeline等多种分析方式,可以满足大部分的分析......
  • Flink Table Api(五)
    基础代码环境信息    //table api     flink三层API(processfunction api/datastream api/sql table api)    import org.apache.flink.streaming.a......
  • Elasticsearch——JavaApi实现索引管理
    版本不同版本的elasticsearch-rest-high-level-client和elasticsearch之间存在兼容风险,请确保和elasticsearch版本一致,否则会出现无法预计的错误。es配置maven依赖<dep......
  • javascript缩短今天的时间为时分秒格式
    我们的需求是,今天的日期只显示HH:mm:ss,这种时分秒格式看下面两个函数//今天零点functiongetTordayZero(){returnnewDate(newDate().toLocaleDateString())......
  • Elasticsearch——search搜索入门
    Search的运行机制Search执行的时候分为两个运行步骤:Query阶段Fetch阶段Query阶段Fetch阶段相关性算分问题相关性算分在shard与shard之间是相互独立的,也就意味着......
  • Java基础(五)| 方法的定义、调用及重载
    ⭐本专栏旨在对JAVA的基础语法及知识点进行全面且详细的讲解,完成从0到1的java学习,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握JAVA编程,同时为后续的框架学习,进阶开......
  • [2022.10.14]Java方法
    加上static变成类变量Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方......
  • java语言概述
    java语言的平台版本1JavaSE标准版2JAVAEE企业版3JAVAME小型版电脑的两种操作方式1图形化界面2命令行(功能更强大)在黑窗口转换路径:d:加回车    查看当前......
  • java_day12
    Java基础Java集合框架什么是集合?​ 对象的容器,定义了对多个对象进程操作的常用方法。可实现数组的功能。与数组的区别是什么?1.数组长度固定,集合长度是不固定1.数组......