2023年7月9日发(作者:)
java代码实现elasticsearch搜索DSL(Domain Specific Language)是ES提出的基于json的搜索⽅式,在搜索时传⼊特定的json格式的数据来完成不同的搜索需求。DSL⽐URI搜索⽅式功能强⼤,在项⽬中建议使⽤DSL⽅式来完成搜索。1. ES客户端ES提供多种不同的客户端:1、TransportClientES提供的传统客户端,官⽅计划8.0版本删除此客户端。2、RestClientRestClient是官⽅推荐使⽤的,它包括两种:Java Low Level REST Client和 Java High Level REST Client。ES在6.0之后提供 Java High Level REST Client, 两种客户端官⽅更推荐使⽤ Java High Level REST Client,不过当前它还处于完善中,有些功能还没有。本次采⽤ Java High Level REST Client,如果它有不⽀持的功能,则使⽤Java Low Level REST Client。添加依赖: elasticsearch‐rest‐high‐level‐client 6.2.1 csearch elasticsearch 6.2.1配置⽂件rchServer: elasticsearch: hostlist: ${eshostlist:127.0.0.1:9200} #多个结点中间⽤逗号分隔3、配置类@Configurationpublic class ElasticsearchConfig { @Value("${st}") private String hostlist; @Bean public RestHighLevelClient restHighLevelClient(){ //解析hostlist配置信息 String[] split = (","); //创建HttpHost数组,其中存放es主机和端⼝的配置信息 HttpHost[] httpHostArray = new HttpHost[]; for(int i=0;i<;i++){ String item = split[i]; httpHostArray[i] = new HttpHost((":")[0], nt((":")[1]), "http"); } //创建RestHighLevelClient客户端 return new RestHighLevelClient(r(httpHostArray)); } //项⽬主要使⽤RestHighLevelClient,对于低级的客户端暂时不⽤ @Bean public RestClient restClient(){ //解析hostlist配置信息 String[] split = (","); //创建HttpHost数组,其中存放es主机和端⼝的配置信息 HttpHost[] httpHostArray = new HttpHost[]; for(int i=0;i<;i++){ String item = split[i]; httpHostArray[i] = new HttpHost((":")[0], nt((":")[1]), "http"); } return r(httpHostArray).build(); }}elasticsearch搜索⽅式主要有以下⼏种:搜索全部记录@Test public void testSearchAll() throws IOException { //搜索请求对象 SearchRequest searchRequest = new SearchRequest("xc_course"); //指定类型 ("doc"); //搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //分页查询,设置起始下标,从0开始 (0); //每页显⽰个数 (10); //搜索⽅式 //matchAllQuery:搜索全部 (llQuery()); //source源字段过虑,第⼀个参数结果集包括哪些字段,第⼆个参数表⽰结果集不包括哪些字段 ource(new String[]{"name", "studymodel"}, new String[]{}); //向搜索请求对象中添加搜索源 (searchSourceBuilder); //执⾏搜索,向es发出http请求 SearchResponse searchResponse = (searchRequest); //获取搜索结果 SearchHits hits = s(); //得到匹配度⾼的⽂档 SearchHit[] searchHits = s(); for (SearchHit hit : searchHits) { String index = ex(); String type = e(); String id = (); //⽂档的主键 float score = re(); String sourceAsString = rceAsString(); //源⽂档内容,就是数据中_source中的内容 Map sourceAsMap = rceAsMap(); String name = (String) ("name"); String studymodel = (String) ("studymodel"); //学习的模式 //由于前⾯设计了源⽂档字段的过滤当中没有包括description,这时description字段是取不到的 String description = (String) ("description"); n(name); n(studymodel); n(description); } }Term Query查询Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。 @Test public void testTermQuery() throws IOException { //搜索请求对象 SearchRequest searchRequest = new SearchRequest("xc_course"); //指定类型 ("doc"); //搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //分页查询,设置起始下标,从0开始 (0); //每页显⽰个数 (10); //
跟上⾯唯⼀的区别 //搜索⽅式 //termQuery精确匹配 (ery("name","spring")); //source源字段过虑,第⼀个参数结果集包括哪些字段,第⼆个参数表⽰结果集不包括哪些字段 ource(new String[]{"name", "studymodel"}, new String[]{}); //向搜索请求对象中添加搜索源 (searchSourceBuilder); //执⾏搜索,向es发出http请求 SearchResponse searchResponse = (searchRequest); //获取搜索结果 SearchHits hits = s(); //得到匹配度⾼的⽂档 SearchHit[] searchHits = s(); for (SearchHit hit : searchHits) { String index = ex(); String type = e(); String id = (); //⽂档的内容 float score = re(); String sourceAsString = rceAsString(); //源⽂档内容,就是数据中_source中的内容 Map sourceAsMap = rceAsMap(); String name = (String) ("name"); String studymodel = (String) ("studymodel"); //学习的模式 //由于前⾯设计了源⽂档字段的过滤,这时description字段是取不到的 String description = (String) ("description"); n(name); n(studymodel); n(description); } }根据id精确匹配@Test public void testId() throws IOException { //搜索请求对象 SearchRequest searchRequest = new SearchRequest("xc_course"); //指定类型 ("doc"); //搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //跟上⾯主要不⼀样的地⽅ //根据id查询 String[] split = new String[]{"1","2"}; List idList = (split); (uery("_id",idList)); //注意是termsQuery()上⾯的是termQuery() //source源字段过虑,第⼀个参数结果集包括哪些字段,第⼆个参数表⽰结果集不包括哪些字段 ource(new String[]{"name", "studymodel"}, new String[]{}); //向搜索请求对象中添加搜索源 (searchSourceBuilder); //执⾏搜索,向es发出http请求 SearchResponse searchResponse = (searchRequest); //获取搜索结果 SearchHits hits = s(); //得到匹配度⾼的⽂档 SearchHit[] searchHits = s(); for (SearchHit hit : searchHits) { String index = ex(); String type = e(); String id = (); //⽂档的内容 float score = re(); String sourceAsString = rceAsString(); //源⽂档内容,就是数据中_source中的内容 Map sourceAsMap = rceAsMap(); String name = (String) ("name"); String studymodel = (String) ("studymodel"); //学习的模式 //由于前⾯设计了源⽂档字段的过滤,这时description字段是取不到的 String description = (String) ("description"); n(name); n(studymodel); n(description); } }match Querymatch Query即全⽂检索,它的搜索⽅式是先将搜索字符串分词,再使⽤各各词条从索引中搜索。@Test public void testMatchQuery() throws IOException { //搜索请求对象 SearchRequest searchRequest = new SearchRequest("xc_course"); //指定类型 ("doc"); //搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //搜索⽅式 (uery("description","spring开发").minimumShouldMatch("80%")); //80%相似度就能匹配到 //source源字段过虑,第⼀个参数结果集包括哪些字段,第⼆个参数表⽰结果集不包括哪些字段 ource(new String[]{"name", "studymodel"}, new String[]{}); //向搜索请求对象中添加搜索源 (searchSourceBuilder); //执⾏搜索,向es发出http请求 SearchResponse searchResponse = (searchRequest); //获取搜索结果 SearchHits hits = s(); //得到匹配度⾼的⽂档 SearchHit[] searchHits = s(); for (SearchHit hit : searchHits) { String index = ex(); String type = e(); String id = (); //⽂档的内容 float score = re(); String sourceAsString = rceAsString(); //源⽂档内容,就是数据中_source中的内容 Map sourceAsMap = rceAsMap(); String name = (String) ("name"); String studymodel = (String) ("studymodel"); //学习的模式 //由于前⾯设计了源⽂档字段的过滤,这时description字段是取不到的 String description = (String) ("description"); n(name); n(studymodel); n(description); } }multiQuerymultiQuery,⼀次可以匹配多个字段。单项匹配是在⼀个field中去匹配,多项匹配是拿关键字去多个Field中匹配。@Test public void testmultiQuery() throws IOException { //搜索请求对象 SearchRequest searchRequest = new SearchRequest("xc_course"); //指定类型 ("doc"); //搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //搜索⽅式 (atchQuery("spring css","name","description") //spring css(注:spring css中间需要有空格不然不分词)在name或者description中任何⼀个有就可以 .minimumShouldMatch("50%") .field("name",10)); //提升boost:给name字段的权重提⾼10倍 //source源字段过虑,第⼀个参数结果集包括哪些字段,第⼆个参数表⽰结果集不包括哪些字段 ource(new String[]{"name", "studymodel"}, new String[]{}); //向搜索请求对象中添加搜索源 (searchSourceBuilder); //执⾏搜索,向es发出http请求 SearchResponse searchResponse = (searchRequest); //获取搜索结果 SearchHits hits = s(); //得到匹配度⾼的⽂档 SearchHit[] searchHits = s(); for (SearchHit hit : searchHits) { String index = ex(); String type = e(); String id = (); //⽂档的内容 float score = re(); String sourceAsString = rceAsString(); //源⽂档内容,就是数据中_source中的内容 Map sourceAsMap = rceAsMap(); String name = (String) ("name"); String studymodel = (String) ("studymodel"); //学习的模式 //由于前⾯设计了源⽂档字段的过滤,这时description字段是取不到的 String description = (String) ("description"); n(name); n(studymodel); n(description); } }BoolQuery查询@Test public void testBooleanQuery() throws IOException { //搜索请求对象 SearchRequest searchRequest = new SearchRequest("xc_course"); //指定类型 ("doc"); //搜索源构建对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //BooleanQuery搜索⽅式 //1.先定义⼀个MultiMatchQuery MultiMatchQueryBuilder field = atchQuery("spring css", "name", "description") .minimumShouldMatch("50%") .field("name", 10); //2.再定义⼀个termqury TermQueryBuilder studymodel1 = ery("studymodel", "201001"); //3.再定义⼀个BooleanQuery,把上⾯两个结合在⼀起 //
布尔查询 BoolQueryBuilder boolQueryBuilder = ery(); (field); (studymodel1); (boolQueryBuilder); //提升boost:给name字段的权重提⾼10倍 //source源字段过虑,第⼀个参数结果集包括哪些字段,第⼆个参数表⽰结果集不包括哪些字段 ource(new String[]{"name", "studymodel"}, new String[]{}); //向搜索请求对象中添加搜索源 (searchSourceBuilder); //执⾏搜索,向es发出http请求 SearchResponse searchResponse = (searchRequest); //获取搜索结果 SearchHits hits = s(); //得到匹配度⾼的⽂档 SearchHit[] searchHits = s(); for (SearchHit hit : searchHits) { String index = ex(); String type = e(); String id = (); //⽂档的内容 float score = re(); String sourceAsString = rceAsString(); //源⽂档内容,就是数据中_source中的内容 Map sourceAsMap = rceAsMap(); String name = (String) ("name"); String studymodel = (String) ("studymodel"); //学习的模式 //由于前⾯设计了源⽂档字段的过滤,这时description字段是取不到的 String description = (String) ("description"); n(name); n(studymodel); n(description); } }布尔查询使⽤过虑器过虑是针对搜索的结果进⾏过虑,过虑器主要判断的是⽂档是否匹配,不去计算和判断⽂档的匹配度得分,所以过虑器性能⽐查询要⾼,且⽅便缓存,推荐尽量使⽤过虑器去实现查询或者过虑器和查询共同使⽤。@Test public void testFilter() throws IOException { SearchRequest searchRequest = new SearchRequest("xc_course"); ("doc"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); MultiMatchQueryBuilder field = atchQuery("spring css", "name", "description") .minimumShouldMatch("50%") .field("name", 10); //布尔查询 BoolQueryBuilder boolQueryBuilder = ery(); (field); //过滤器,跟上⾯的不⼀样处 (ery("studymodel", "201001"));//在studymodel象⾥过滤201001 (uery("price").gte(60).lte(100)); //价格区间 (boolQueryBuilder); //source源字段过虑,第⼀个参数结果集包括哪些字段,第⼆个参数表⽰结果集不包括哪些字段 ource(new String[]{"name", "studymodel"}, new String[]{}); (searchSourceBuilder); SearchResponse searchResponse = (searchRequest); SearchHits hits = s(); SearchHit[] searchHits = s(); for (SearchHit hit : searchHits) { String index = ex(); String type = e(); String id = (); float score = re(); String sourceAsString = rceAsString(); Map sourceAsMap = rceAsMap(); String name = (String) ("name"); String studymodel = (String) ("studymodel"); String description = (String) ("description"); n(name); n(studymodel); n(description); } }
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688896426a181876.html
评论列表(0条)