Elasticsearch的使用总结

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。

  1. put/post请求:http://localhost:9200/索引库名称

    {"settings":{"index":{"number_of_shards":1,  # 分片数量,存储到不同的节点,提高处理能力和高可用性 刚开始是一个 这里没有集成"number_of_replicas":0 # 每个节点的副本数量,提高 高可用性}}
    }
    get  http://localhost:9200/索引库名称 查询创建索引的信息 
   2.post http://localhost:9200/索引库名称/类型名称/_mappingpost 请求:http://localhost:9200/xc_course/doc/_mapping~~~java{"properties": {"name": {"type": "text" // varchar},"description": {"type": "text"},"studymodel": {"type": "keyword"}}}~~~3.put 或Post http://localhost:9200/xc_course/doc/id值 (如果不指定id值ES会自动生成ID)http://localhost:9200/xc_course/doc/1~~~java{ "name":"Bootstrap开发框架","description":"Bootstrap是由Twitter推出的一个前台页面开发框架,在行业之中使用较为广泛。此开发框架包 含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长页面开发的程序人员)轻松的实现一个不受浏览器限制的 精美界面效果。", "studymodel":"201001" }~~~4.根据课程id查询文档 发送:get http://localhost:9200/xc_course/doc/1
​5. 发送 get http://localhost:9200/xc_course/doc/_search 查询全部的数据6. 查询名称中包括spring 关键字的的记录 发送:get http://localhost:9200/xc_course/doc/_search?q=name:bootstrap
​
​
​
7.post 发送:localhost:9200/_analyze 
​
{"text":"郭树翔",  --这里没有写到main.dic文件中去就是一个一个的字"analyzer":"ik_max_word" 
}
​
~~~java{"text":"测试分词器,后边是测试内容:spring cloud实战","analyzer":"ik_max_word"  -- 分词器 精确一点"analyzer":"ik_smart"    -- 分词器 大体一下}
8.GET: http://localhost:9200/(不止一个index那就要指定名字)_mapping就是查看index 所有的属性和字段
{"gsx_frank": {"mappings": {"doc": {"properties": {"description": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"name": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"studymodel": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}}}}
}body 请求体中的  application/json
~~~
​
9.delete请求:`http://localhost:9200/索引库名称`
​
```java
analyzer和search_analyzer 的区别
说明
​
分析器(analyzer)主要有两种情况会被使用:
​
插入文档时,将text类型的字段做分词然后插入倒排索引,。
在查询时,先对要查询的text类型的输入做分词,再去倒排索引搜索。
在索引(即插入文档)时,只会去看字段有没有定义analyzer,有定义的话就用定义的,没定义就用ES预设的。
​
在查询时,会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义,才会去使用ES预设的。
10. index 
通过index属性指定是否索引。 
默认为index=true,即要进行索引,只有进行索引才可以从索引库搜索到。 
但是也有一些内容不需要索引,比如:商品图片地址只被用来展示图片,不进行搜索图片,此时可以将index设置为false。 
删除索引,重新创建映射,将pic的index设置为false,尝试根据pic去搜索,结果搜索不到数据 
"pic": { "type": "text", "index":false  -- 这个字段就不可以被查到了
} 
​
11. keyword关键字字段
上边介绍的text文本字段在映射时要设置分词器,keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段的索引时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。 "price": { "type": "scaled_float", "scaling_factor": 100  比例因子  price*100 四首五入的去数值
}, 

took:本次操作花费的时间,单位为毫秒。 
timed_out:请求是否超时 
_shards:说明本次操作共搜索了哪些分片 
hits:搜索命中的记录 
hits.total : 符合条件的文档总数 hits.hits :匹配度较高的前N个文档 
hits.max_score:文档匹配得分,这里为最高分 
_score:每个文档都有一个匹配度得分,按照降序排列。 
_source:显示了文档的原始内容。 
package com.guoshuxiang.service;
​
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
​
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
​
​
@Service
public class EsService {@Autowiredprivate RestHighLevelClient client;
​/*** index 和添加映射放 在 一起的** @throws Exception*/public void createIndex() throws Exception {// 创建一个indexCreateIndexRequest createIndexRequest = new CreateIndexRequest("zg_love");// 设置一个  微服务数量初始 1   备份数量 初始 0createIndexRequest.settings(Settings.builder().put("number_of_shards", "1").put("number_of_replicas", "0"));createIndexRequest.mapping("doc", "{\n" +"\t\"properties\": {\n" +"\t\t\"name\": {\n" +"\t\t\t\"type\": \"text\",\n" +"\t\t\t\"analyzer\": \"ik_max_word\",\n" +"\t\t\t\"search_analyzer\": \"ik_smart\"\n" +"\t\t},\n" +"\t\t\"description\": {\n" +"\t\t\t\"type\": \"text\",\n" +"\t\t\t\"analyzer\": \"ik_max_word\",\n" +"\t\t\t\"search_analyzer\": \"ik_smart\"\n" +"\t\t},\n" +"\t\t\"studymodel\": {\n" +"\t\t\t\"type\": \"keyword\"\n" +"\t\t},\n" +"\t\t\"price\": {\n" +"\t\t\t\"type\": \"float\"\n" +"\t\t},\n" +"\t\t\"timestamp\": {\n" +"\t\t\t\"type\": \"date\",\n" +"\t\t\t\"format\": \"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"\n" +"\t\t}\n" +"\t}\n" +"}", XContentType.JSON); // 指定传过的条件是json的格式CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);System.out.println(createIndexResponse.isAcknowledged()); // 看看索引是否创建成功
​}
​/*** 删除索引** @throws Exception*/public void deleteIndex() throws Exception {DeleteIndexRequest indexRequest = new DeleteIndexRequest("zg_love");AcknowledgedResponse delete = client.indices().delete(indexRequest, RequestOptions.DEFAULT);System.out.println(delete.isAcknowledged());}
/***  创建index 和 删除 index 都要用到*  XXXXIndexRequest*  直接对映射表操作的话就直接使用*  Get delete index update Request 的请求对(index)进行操作*//***  添加一条数据* @throws Exception*  CreateIndexRequest        IndexRequest*  前者是用来创建并配置索引的,后者是将数据与索引相关联,并且让数据可以被搜索。*/public void addDoc() throws Exception {Map<String,Object> jsonMap = new HashMap<>();jsonMap.put("name", "spring cloud实战");jsonMap.put("description", "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud基础入门 3.实战Spring Boot 4.注册中心eureka。");jsonMap.put("studymodel", "201001");SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");jsonMap.put("timestamp", dateFormat.format(new Date()));jsonMap.put("price", 5.6f);// 添加数据的请求 index  doc  1 不指定的话会自动添加一个IndexRequest indexRequest = new IndexRequest("zg_love","doc","1");indexRequest.source(jsonMap); // 数据源要放进去 要把条件放进去IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
​System.out.println(indexResponse.status());}
​/***  修改一条数据* @throws Exception*/public void update() throws Exception {UpdateRequest updateRequest = new UpdateRequest("zg_love","doc","1");Map<String,Object> jsonMap = new HashMap<>();jsonMap.put("name","spring love you");updateRequest.doc(jsonMap); // 更新是doc的方法来使用的UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);System.out.println(updateResponse.status());}
​/***  得到一条数据* @throws Exception*/public void get() throws Exception{GetRequest getRequest = new GetRequest("zg_love","doc","1");// index 中存一条数据的就是 document -> 里面有好多 field的 字段GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);Map<String, Object> sourceAsMap =  documentFields.getSourceAsMap();System.out.println(sourceAsMap);}
​/***  删除一条数据* @throws Exception*/public void delete() throws Exception{DeleteRequest deleteRequest = new DeleteRequest("zg_love","doc","1");DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);System.out.println(deleteResponse.status());}
}
​

下面开始使用post 请求来查询数据 都是json 格式的形式来操作的

查询指定索引库指定类型下的文档。(通过使用此方法) 
发送:post http://localhost:9200/xc_course/doc/_search
{ "query": { "match_all": {}  // 换成java 代码来使用 在这里}
} 
​
{"from": 0,"size": 1,"query": {"match_all": {}},"_source": ["name", "studymodel"]
}
//设置分页参数 这几个参数是同级的 {}
searchSourceBuilder.from((index - 1) * size);
searchSourceBuilder.size(size);
{"query": {"term": {"name": "java"  //%java%}},"_source": ["name", "studymodel"]
}
 //设置查询方式 (精准查询)   %201002%
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201002");

{"query": {"terms": {"price": [38.6,68.6] // 可以有多个值}},"_source": ["name", "studymodel"]
}
// 这里有可变参数,不止一条数据  单个字段的多值查询
QueryBuilders.termsQuery("studymodel", stus); // 这里放的是数组
{ "query": {"match": {"description": {"query": "spring框架","operator": "or","minimum_should_match": "80%"}}} 
}
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("description", "spring开发框架");// 分词是中文和英文的状态小 , text 类型 并且设置了 ik分词器才可以的
matchQueryBuilder.operator(Operator.OR); // 指定操作是 or 多个条件满足一个就行了
matchQueryBuilder.minimumShouldMatch("80%"); //  提高精准度
{"query": {"multi_match": {"query": "spring css","minimum_should_match": "50%","fields": ["name^10", "description"]}}
 //设置查询方式 (分词查询)MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders               .multiMatchQuery("spring框架", "name", "description");  //  text   field 参数// 给field 增加 权重multiMatchQueryBuilder.field("name", 10);
{"query": {"bool": {"must": [{ //  还有可能是 should"multi_match": {"query": "spring框架","minimum_should_match": "50%","fields": ["name^10", "description"]}}, {"term": {"studymodel": "201002"}}]}}
}
 // 构建boolean的条件BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//条件一if (!StringUtils.isEmpty(keyword)) {// 多列查询MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyword, "name", "description");// 设置权重multiMatchQueryBuilder.minimumShouldMatch("50%");// 分词反满一个就行multiMatchQueryBuilder.operator(Operator.OR);// and 的关系 是并列下一个条件的boolQueryBuilder.must(multiMatchQueryBuilder);}//条件二if (!StringUtils.isEmpty(studymodel)) {//  精确查询结果TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", studymodel);// and 构建多条件boolQueryBuilder.must(termQueryBuilder);}
{// 这么多要操作的filed"_source": ["name", "studymodel", "description", "price"],"query": {"bool": {"must": [{"multi_match": {"query": "spring框架","minimum_should_match": "50%","fields": ["name^10", "description"]}}],"filter": [{"term": {"studymodel": "201001"}}, {"range": {"price": {"gte": 60,"lte": 100}}}]}}
}
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("price"); // 这里是查询条件
rangeQueryBuilder.gte(min).lte(max); // 这里是最大最小的小于最大的
boolQueryBuilder.filter(rangeQueryBuilder); // 添加到过滤其中
"highlight": {  // 这里和条件是一个级别的  最后都要放到 条件收集器中"pre_tags": ["<span style=’color:red;’>"],"post_tags": ["</span>"],"fields": {"name": {},"description": {}}}
//设置高亮对象HighlightBuilder highlightBuilder = new HighlightBuilder(); // 开头标签
highlightBuilder.preTags("<span style='color:red;'>");
highlightBuilder.postTags("</span>"); // 后面的标签
highlightBuilder.fields().add(new  HighlightBuilder.Field("name")); // 添加一个给高亮的条件
highlightBuilder.fields().add(new HighlightBuilder.Field("description"));
searchSourceBuilder.highlighter(highlightBuilder); //最后将高亮并列在查询条件中
//获取高亮数据Map<String, HighlightField> fieldMap =  hit.getHighlightFields(); // 获取到键值对HighlightField nameField = fieldMap.get("name"); //获取到关键的字if (nameField != null) { // 不为空的StringBuffer nameSbf = new StringBuffer(); //Text[] fragments = nameField.fragments(); // 取到那个一满足的字段for (Text text : fragments) {nameSbf.append(text.toString()); // 循环满足的去拼接字符}course.setName(nameSbf.toString()); // 最后添加到字段类型中去}
"sort": [{"studymodel": "desc"}, {"price": "asc"}]
 //添加排序
searchSourceBuilder.sort(new FieldSortBuilder("studymodel").order(SortOrder.DESC));
// 排序调用 sort() filed的条件对象 在调用 升序和降序 
searchSourceBuilder.sort(new FieldSortBuilder("price").order(SortOrder.DESC));
searchSourceBuilder.aggregation(AggregationBuilders.terms("brandGroup").field("brand_name").size(50));
   public void all() throws Exception {SearchRequest searchRequest = new SearchRequest("zg_love");searchRequest.types("doc");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();sourceBuilder.query(matchAllQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits(); //一共有多少条数据System.out.println("总的记录是" + totalHits);SearchHit[] searchHits = hits.getHits();//具体存放数据的地方for (SearchHit hit : searchHits) {String id = hit.getId();Map<String, Object> sourceAsMap = hit.getSourceAsMap();sourceAsMap.put("id", id);System.out.println(sourceAsMap);}}/*** 获取分页的数据 分页 limit 是一个大的函数 和条件是同级关系** @param index 初始页码* @param size  每页大小* @throws Exception*/public void page(Integer index, Integer size) throws Exception {SearchRequest searchRequest = new SearchRequest("zg_love");searchRequest.types("doc");// 构建大的条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.from((index - 1) * size);searchSourceBuilder.size(size);MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();searchSourceBuilder.query(matchAllQueryBuilder); // 封装的条件searchRequest.source(searchSourceBuilder); // 最后条件放进去SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits();System.out.println("总的条数" + totalHits);SearchHit[] hitsHits = hits.getHits();for (SearchHit hit : hitsHits) {String id = hit.getId();Map<String, Object> sourceAsMap = hit.getSourceAsMap();sourceAsMap.put("id", id);System.out.println(sourceAsMap);}}/*** 精确查询就是这个数据必须在一起,才可以查到一条数据不然是找到不到数据的** @throws Exception*/public void term() throws Exception {SearchRequest searchRequest = new SearchRequest("zg_love");searchRequest.types("doc");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "spring");searchSourceBuilder.query(termQueryBuilder);// 指定要查询的字段searchSourceBuilder.fetchSource(new String[]{"name", "studymodel", "price"}, null);searchRequest.source(searchSourceBuilder); // 最后一定要带上条件啊不然就会查出全部的数据SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits();System.out.println("总的数据 : " + totalHits + "条");SearchHit[] hitsHits = hits.getHits();for (SearchHit hit : hitsHits) {String id = hit.getId();Map<String, Object> sourceAsMap = hit.getSourceAsMap();sourceAsMap.put("id", id);System.out.println(sourceAsMap);}}/*** 单个列的精确查询** @throws Exception*/public void terms() throws Exception {SearchRequest searchRequest = new SearchRequest("zg_love");searchRequest.types("doc");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 多条件精确查询数据   字段  具体的字  ... 可变参数 这里的数据TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "cloud");searchSourceBuilder.query(termsQueryBuilder);searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits();System.out.println("总数据量:" + totalHits);SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {String id = hit.getId();Map<String, Object> sourceAsMap = hit.getSourceAsMap();sourceAsMap.put("id", id);System.out.println(sourceAsMap);}}/*** 分词查询数据 必须是text 类型的数据才可以的** @throws Exception*/public void match() throws Exception {SearchRequest searchRequest = new SearchRequest("zg_love");searchRequest.types("doc");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 分子是match 来查询的MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("description", "spring开发入门");matchQueryBuilder.operator(Operator.OR);  // 默认就是 or的 关系   这里是分开的词有一个满足就行了matchQueryBuilder.minimumShouldMatch("80%"); // 3 * 0.8 = 2.4 向下取整 2 至少有两个关键词才可以的searchSourceBuilder.query(matchQueryBuilder);searchRequest.source(searchSourceBuilder);//执行请求获取响应SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits();System.out.println("总数据量:" + totalHits);SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {String id = hit.getId();Map<String, Object> sourceAsMap = hit.getSourceAsMap();sourceAsMap.put("id", id);System.out.println(sourceAsMap);}}/*** 多列分词查询** @throws Exception*/public void mutilMatch() throws Exception {SearchRequest searchRequest = new SearchRequest("zg_love");searchRequest.types("doc");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 这个词在两个关键字中来写啊MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("实战语言", "name", "description");multiMatchQueryBuilder.field("name", 10); // 扩大数据提高分数 优先在最前面searchSourceBuilder.query(multiMatchQueryBuilder);searchRequest.source(searchSourceBuilder);//执行请求获取响应SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits();System.out.println("总数据量:" + totalHits);SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {String id = hit.getId();float score = hit.getScore();Map<String, Object> sourceAsMap = hit.getSourceAsMap();sourceAsMap.put("id", id);sourceAsMap.put("score", score);System.out.println(sourceAsMap);}}/***  注意:range 和 term一次只能对一个 Field 设置范围过虑。 不可以是多个* @param keyword 分词的关键字* @param studymodel 精确查询的关键字* @throws Exception*/public void bool(String keyword, String studymodel) throws Exception {SearchRequest searchRequest = new SearchRequest("zg_love");searchRequest.types("doc");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// boolean 这是大条件BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 这里逻辑相反if (!StringUtils.isEmpty(keyword)) {   //多列分词查询MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyword, "name", "description");multiMatchQueryBuilder.minimumShouldMatch("50%");multiMatchQueryBuilder.operator(Operator.OR);multiMatchQueryBuilder.field("description",10);boolQueryBuilder.must(multiMatchQueryBuilder); //} // must 是全都满足条件的 上下两个条件都满足才行的if (!StringUtils.isEmpty(studymodel)) { // 精确查询TermsQueryBuilder termQueryBuilder = QueryBuilders.termsQuery("studymodel", studymodel);boolQueryBuilder.must(termQueryBuilder);}searchSourceBuilder.query(boolQueryBuilder);searchRequest.source(searchSourceBuilder);//执行请求获取响应SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits();System.out.println("总数据量:" + totalHits);SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {String id = hit.getId();float score = hit.getScore();Map<String, Object> sourceAsMap = hit.getSourceAsMap();sourceAsMap.put("id", id);sourceAsMap.put("score",score);System.out.println(sourceAsMap);}}public List<Course> filter(String keyword, String studymodel, Double min, Double max) throws Exception{SearchRequest searchRequest = new SearchRequest("zg_love");searchRequest.types("doc");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 这里是原始数据  在这个数据上开始过滤数据if (! StringUtils.isEmpty(keyword)){MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyword, "name", "description");multiMatchQueryBuilder.minimumShouldMatch("50%");multiMatchQueryBuilder.field("description",10);boolQueryBuilder.must(multiMatchQueryBuilder);}if(!StringUtils.isEmpty(studymodel)){TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("studymodel", studymodel);boolQueryBuilder.filter(termsQueryBuilder);}if (min != null && max != null){RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("price");rangeQueryBuilder.gte(min).lte(max);boolQueryBuilder.filter(rangeQueryBuilder);}// 排序这是一个方法  在这里 所以直接写在 大的条件构造器中searchSourceBuilder.sort(new FieldSortBuilder("studymodel").order(SortOrder.DESC));searchSourceBuilder.sort(new FieldSortBuilder("price").order(SortOrder.ASC));HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.preTags("<span style='color:red;'>");highlightBuilder.postTags("</span>");
//
//        //搜索 数据 另一种写法
//        SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2").
//        setTypes("article").setQuery(QueryBuilders.termQuery("title","搜索 "));
//        //高亮定义
//        searchRequestBuilder.addHighlightedField("title");//对title字段进行高亮显示
//        searchRequestBuilder.setHighlighterPreTags("<em>");//前置元素
//        searchRequestBuilder.setHighlighterPostTags("</em>");//后置元素
//        SearchResponse searchResponse = searchRequestBuilder.get();// 这里用自己还是不行的  还要用内名对象来操作highlightBuilder.fields().add(new HighlightBuilder.Field("name"));highlightBuilder.fields().add(new HighlightBuilder.Field("description"));searchSourceBuilder.query(boolQueryBuilder);searchSourceBuilder.highlighter(highlightBuilder); // 将高亮放进去searchRequest.source(searchSourceBuilder);SearchResponse searchResponse  = client.search(searchRequest, RequestOptions.DEFAULT);// 如果要写前端的话这里的展示数据就不要写了SearchHits hits = searchResponse.getHits();long totalHits = hits.getTotalHits();System.out.println("总数据量: " + totalHits);SearchHit[] searchHits = hits.getHits();List<Course> list = new ArrayList<>();for (SearchHit hit : searchHits) {String id = hit.getId();String json = hit.getSourceAsString();// 里面的字段一一对应赋值Course course = JSON.parseObject(json, Course.class);// 这里是满足高亮的数据Map<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField nameField = highlightFields.get("name");if (nameField != null){StringBuffer nameBuf = new StringBuffer();// 获取到原有内容中 每个高亮显示 集中位置fragment就是高亮片段 可能不止有一处高亮Text[] fragments = nameField.fragments();//for (Text text : fragments) {nameBuf.append(text.toString());}course.setName(nameBuf.toString());}HighlightField description = highlightFields.get("description");if (description != null){StringBuffer dSbf = new StringBuffer();// text 类型的数据 文本类型要转化为String 在java中使用Text[] text = description.fragments();for (Text t : text) {dSbf.append(t.toString());}course.setName(dSbf.toString());}course.setId(id);list.add(course);}return list;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

风速预测(三)EMD-LSTM-Attention模型

目录 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为7&#xff0c;制作数据集 3 基于Pytorch的EMD-LSTM-Attention模型预测 3.1 数据加载&#…

uniapp怎么获取微信步数

微信步数获取的背景 微信步数是指用户在微信运动中记录的步数数据。微信提供了开放能力&#xff0c;允许第三方应用获取用户授权后的微信步数数据&#xff0c;以便进行进一步的数据分析和展示。使用时报错&#xff1a;fail api scope is not declared in the privacy agreemen…

libevent服务GET/POST的简单使用

目录 1、前言2、测试demo2.1、目录结构2.2、 测试源码2.2.1、http_server.cpp2.2.2、 http_server.h 2.3、 编译2.4、 运行结果2.4.1、测试POST2.4.2 、测试GET请求 1、前言 项目开发中经常需要使用到私有协议和Qt,Android等GUI前端通信&#xff0c;比较常用的使用POST和GET方式…

计算机操作系统-第十八天

目录 进程调度时机 补充知识 进程调度的方式 非剥夺调度方式 剥夺调度方式 进程的切换与过程 本节思维导图 进程调度时机 进程调度&#xff08;低级调度&#xff09;&#xff0c;即按照某种算法从就绪队列中选择一个进程为其分配处理机。 共有两种需要进行进程调度与…

基于junit4搭建自定义的接口自动化测试框架

随着业务的逐步稳定&#xff0c;对于接口的改动也会逐渐变少。更多的是对业务逻辑的优化&#xff0c;功能实现的完善。对于测试来说&#xff0c;重复繁琐的功能测试不仅效率低下&#xff0c;而且耗费一定的人力资源。笔者支持的信息流业务下的一个图文管理平台就是一个功能较为…

Lambda表达式的简单理解

1. 初识lambda表达式 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式&#xff08;Lambda exp…

广州华锐互动:VR煤矿特殊工种作业实训帮助提高矿工的操作技能和安全意识

VR煤矿特殊工种作业实训系统为煤矿企业培训提供了全方位的支持&#xff0c;帮助提高矿工的操作技能和安全意识&#xff0c;促进煤矿企业的安全生产。 首先&#xff0c;VR煤矿特殊工种作业实训系统可以提供逼真的虚拟操作环境&#xff0c;使矿工能够身临其境地感受各种工种的作业…

计算机网络 网络层上 | IP数据报,IP地址,ICMP,ARP等

文章目录 1 网络层的两个层面2 网络协议IP2.1 虚拟互联网络2.2 IP地址2.2.1 固定分类编址方式2.2.2 无分类编制CIDR2.2.3 MAC地址和IP地址区别 2.3 地址解析协议ARP2.3.1 解析过程 2.4 IP数据报格式 3 IP层转发分组流程4 国际控制报文协议ICMP4.1 ICMP格式结构4.2 分类4.2.1 差…

学习MS Dynamics AX 2012编程开发 2. X++语言

X是用于构建Dynamics AX功能的编程语言。X是一种与C类似的面向对象编程语言。 完成本章后&#xff0c;您将能够理解X语言&#xff1b;您将知道可用的数据类型是什么&#xff0c;如何创建各种循环&#xff0c;如何比较和操作变量&#xff0c;在哪里可以找到预定义的函数&#x…

【Android逆向】记录一次某某虚拟机的逆向

导语 学了一段时间的XPosed&#xff0c;发现XPosed真的好强&#xff0c;只要技术强&#xff0c;什么操作都能实现... 这次主要记录一下我对这款应用的逆向思路 apk检查 使用MT管理器检查apk的加壳情况 发现是某数字的免费版本 直接使用frida-dexdump 脱下来后备用 应用分…

二叉树前,中序推后续_中,后续推前序

文章目录 介绍思路例子 介绍 二叉树是由根、左子树、右子树三部分组成。 二叉树的遍历方式又可以分为前序遍历&#xff0c;中序遍历&#xff0c;后序遍历。 前序遍历&#xff1a;根&#xff0c;左子树&#xff0c;右子树 中序遍历&#xff1a;左子树&#xff0c;根&#xff0…

菜鸟学习日记(python)——匿名函数

Python 使用 lambda 来创建匿名函数。 lambda 函数是一种小型、匿名的内联函数&#xff0c;它可以具有任意数量的参数&#xff0c;但只能有一个表达式。 匿名函数的一般格式如下&#xff1a; lambda 参数列表:表达式 表达式用于计算并返回函数结果 lambda 函数通常用于编写…

FreeRtos里的几个中断屏蔽

1、primask 寄存器 PRIMASK用于禁止除NMI和HardFalut外的所有异常和中断&#xff0c;使用方法&#xff1a; cpsid i &#xff1b; //设置primask &#xff08;禁止中断&#xff09; cpsie i ; //清除primask (使能中断) 也可以 movs r0,#1 msr primask r0; //将 1写入p…

C# WPF上位机开发(网络程序界面开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前我们讨论过&#xff0c;设备之间通讯的方式很多。但是&#xff0c;不知道大家有没有注意&#xff0c;前面谈到的这些通讯方式都需要上位机电脑…

华为云创新动能涌现,浒墅关开启先进制造新纪元

编辑&#xff1a;阿冒 设计&#xff1a;沐由 穿境而过的京杭大运河&#xff0c;孕育了苏州浒墅关深厚的历史文化底蕴。千年延续不断的繁华&#xff0c;滋养了一代又一代奋进的浒墅关人。今天&#xff0c;一座国家级经开区挺立在这里&#xff0c;散发出创新创业的蓬勃活力。 苏州…

WordPress如何搭建多站点

这边之前有讲到过wordpress站中站&#xff08;栏目站&#xff09;建站教程&#xff0c;同样的也有讲到过WordPress开启多站点配置&#xff0c;两种方法都是用来搭建子站点的&#xff0c;而开启多站点的方式不同于普通搭建站中站&#xff0c;多站点配置开启&#xff0c;是可以实…

STM32F407-14.3.18-01连接霍尔传感器

连接霍尔传感器 可通过用于生成电机驱动 PWM 信号的高级控制定时器&#xff08;TIM1 或 TIM8&#xff09;以及图 114 中称为 “接口定时器”的另一个定时器 TIMx&#xff08;TIM2、TIM3、TIM4 或 TIM5&#xff09;&#xff0c;实现与霍尔传感器的连接。3 个定时器输入引脚&…

【C语言】实战项目——通讯录

引言 学会创建一个通讯录&#xff0c;对过往知识进行加深和巩固。 文章很长&#xff0c;要耐心学完哦&#xff01; ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 实战 建…

C语言——完数难题(编程题目)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命如同寓言&#xff0c;其价值不在于…

【数据分享】2019-2023年我国区县逐年二手房房价数据(Excel/Shp格式)

房价是一个区域发展程度的重要体现&#xff0c;一个区域的房价越高通常代表这个区域越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01;之前我们分享了2019—2023年我国区县逐月的二手房房价数据…