06(06cr19ni10)

  本篇文章为你整理了06(06cr19ni10)的详细内容,包含有06年属啥 06cr19ni10 06cr19ni10是什么材质 06年世界杯 06,希望能帮助你了解 06。

  Elasticsearch默认是根据相关度算分(_score)来排序,但是也支持自定义方式对搜索结果排序,可以排序的字段类型有如下几种

  keyword类型

  地理坐标类型

  
排序条件是一个数组,也就是可以写多个排序条件;按照声明的排序,当第一个条件相等的时候,再按照第二个条件排序,依次类推

  
"_geo_distance":{

  "FIELD":"纬度,经度", // 文档中geo_point类型的字段名、目标坐标点

  "order":"asc", // 排序方式

  "unit":"km" // 排序的距离单位

  }

  }

  ]

  

 

 

  
①、指定一个坐标,作为目标点

  ②、计算每一个文档中,指定字段(必须是geo_point类型)的坐标,到目标点的距离是多少

  ③、根据距离排序

  
假设我的位置坐标是:113.266022,22.995959,寻找周围距离最近的酒店的DSL语句如下所示(location字段也可以不使用大括号,直接使用字符串)

  
// 3. 执行查询,获取响应结果

   SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

   // 4. 处理响应数据

   handlerCommonResponse(response);

  
private void handlerCommonResponse(SearchResponse response) throws JsonProcessingException {

   // 1. 得到命中的数量(即总记录数量)

   SearchHits hits = response.getHits();

   long totalCount = hits.getTotalHits().value;// 总记录数

   System.out.println("总记录数量为:" + totalCount);

   // 2. 获取本次查询出来的列表数据

   SearchHit[] hitsArray = hits.getHits();

   for (SearchHit hit : hitsArray) {

   Object[] sortValues = hit.getSortValues();

   if (sortValues.length 0) {

   System.out.println("当前酒店得分为【" + sortValues[0] + "】");

   System.out.println("当前酒店价格为【" + sortValues[1] + "】");

   // 得到json字符串

   String json = hit.getSourceAsString();

   // 将json字符串转换为实体类对象

   HotelDoc hotelDoc = objectMapper.readValue(json, HotelDoc.class);

   System.out.println(hotelDoc);

  

 

 

  
new GeoPoint(22.995959,113.266022)

   ).order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS)

   // 3. 执行查询,获取响应数据

   SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

   // 4. 处理响应结果

   handlerGeoResponse(response);

  
private void handlerGeoResponse(SearchResponse response) throws JsonProcessingException {

   // 1. 得到命中的数量(即总记录数量)

   SearchHits hits = response.getHits();

   long totalCount = hits.getTotalHits().value;// 总记录数

   System.out.println("总记录数量为:" + totalCount);

   // 2. 获取本次查询出来的列表数据

   SearchHit[] hitsArray = hits.getHits();

   for (SearchHit hit : hitsArray) {

   Object[] sortValues = hit.getSortValues();

   if (sortValues.length 0) {

   System.out.println("距离当前位置【" + sortValues[0] + "】公里");

   // 得到json字符串

   String json = hit.getSourceAsString();

   // 将json字符串转换为实体类对象

   HotelDoc hotelDoc = objectMapper.readValue(json, HotelDoc.class);

   System.out.println(hotelDoc);

  

 

 

  
Elasticsearch默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了

  Elasticsearch中通过修改from、size参数来控制要返回的分页结果

  from:从第几个文档开始,从0开始

  size:总共查询几个文档

  
类似于MySQL中的limit ?, ?

  DSL格式比较简单,这里就不多说了;只需要添加上面说的两个参数即可

  3.2.1、分页查询

  DSL语句如下图所示

  
import com.coolman.hotel.pojo.HotelDoc;

  import com.fasterxml.jackson.core.JsonProcessingException;

  import com.fasterxml.jackson.databind.ObjectMapper;

  import org.elasticsearch.action.search.SearchRequest;

  import org.elasticsearch.action.search.SearchResponse;

  import org.elasticsearch.client.RequestOptions;

  import org.elasticsearch.client.RestHighLevelClient;

  import org.elasticsearch.index.query.QueryBuilder;

  import org.elasticsearch.index.query.QueryBuilders;

  import org.elasticsearch.search.SearchHit;

  import org.elasticsearch.search.SearchHits;

  import org.junit.jupiter.api.Test;

  import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.boot.test.context.SpringBootTest;

  import java.io.IOException;

   * 分页

  @SpringBootTest

  public class PageQueryTest {

   @Autowired

   private RestHighLevelClient restHighLevelClient;

   //jackson

   private final ObjectMapper objectMapper = new ObjectMapper();

   * 分页查询测试

   * @throws IOException

   @Test

   public void testPage() throws IOException {

   int from = 0;

   int size = 2;

   // 1. 创建查询请求体

   SearchRequest searchRequest = new SearchRequest("hotel");

   // 2. 添加查询请求体

   searchRequest.source().query(

   QueryBuilders.matchAllQuery()

   ).from(from).size(size);

   // 3. 执行操作,获取响应数据

   SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

   // 4. 处理响应数据

   handlerResponse(response);

  
private void handlerResponse(SearchResponse response) throws JsonProcessingException {

   // 1. 得到命中的数量(即总记录数量)

   SearchHits hits = response.getHits();

   long totalCount = hits.getTotalHits().value;// 总记录数

   System.out.println("总记录数量为:" + totalCount);

   // 2. 获取本次查询出来的列表数据

   SearchHit[] hitsArray = hits.getHits();

   for (SearchHit hit : hitsArray) {

   // 得到json字符串

   String json = hit.getSourceAsString();

   // 将json字符串转换为实体类对象

   HotelDoc hotelDoc = objectMapper.readValue(json, HotelDoc.class);

   System.out.println(hotelDoc);

  

 

 

  
"match":{

  "FIELD":"TEXT" // 查询条件,高亮一定要使用全文检索查询

  }

  },

  "highlight":{

  "fields":{//指定要高亮的字段

  "FIELD":{

  "pre_tags":" em ",//用来标记高亮字段的前置标签 ,默认使用 em 标签

  "post_tags":" /em "//用来标记高亮字段的后置标签

  }

  }

  }

  

 

 

  
高亮是对关键字高亮,因此搜索条件必须带有关键字,而不能是范围这样的查询。

  默认情况下,高亮的字段,必须与搜索指定的字段一致,否则无法高亮

  如果要对非搜索字段高亮,则需要添加一个属性:required_field_match=false

  
# true 代表高亮字段必须出现在条件中,才可以高亮

  # false代表高亮字段不一定要出现在条件,也可以高亮

  GET hotel/_search

   "query": {

   "match": {

   "name": "如家"

   "highlight": {

   "fields": {

   "brand": {},

   "name": {}

   "require_field_match": "false",

   "pre_tags": " front color=red ",

   "post_tags": " /front "

  

 

 

  
 

  PS:这里的DSL语句可以有些不同,比如fields可以是数组,然后require_field_match、pre_tags、post_tags都可以放在字段中

  变化有点多,这里就不演示了,上面的是相当于全局配置的意思

  
import com.coolman.hotel.pojo.HotelDoc;

  import com.fasterxml.jackson.core.JsonProcessingException;

  import com.fasterxml.jackson.databind.ObjectMapper;

  import org.elasticsearch.action.search.SearchRequest;

  import org.elasticsearch.action.search.SearchResponse;

  import org.elasticsearch.client.RequestOptions;

  import org.elasticsearch.client.RestHighLevelClient;

  import org.elasticsearch.common.text.Text;

  import org.elasticsearch.index.query.QueryBuilder;

  import org.elasticsearch.index.query.QueryBuilders;

  import org.elasticsearch.search.SearchHit;

  import org.elasticsearch.search.SearchHits;

  import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;

  import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;

  import org.junit.jupiter.api.Test;

  import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.boot.test.context.SpringBootTest;

  import java.io.IOException;

  import java.util.Collection;

  import java.util.Collections;

  import java.util.Map;

   * 高亮显示

  @SpringBootTest

  public class HighLightQueryTest {

   @Autowired

   private RestHighLevelClient restHighLevelClient;

   //jackson

   private final ObjectMapper objectMapper = new ObjectMapper();

   @Test

   public void testHighLightSearch() throws IOException {

   // 1. 创建查询请求对象

   SearchRequest searchRequest = new SearchRequest("hotel");

   // 2. 添加查询请求体

   HighlightBuilder highlightBuilder = new HighlightBuilder();

   // 添加高亮字段方式1(暂时不知道什么区别,了解就好)

  // highlightBuilder.fields().add(new HighlightBuilder.Field("name"));

  // highlightBuilder.fields().add(new HighlightBuilder.Field("brand"));

   // 添加高亮字段方式2

   highlightBuilder.field("name");

   highlightBuilder.field("brand");

   // 这里相当于是全局的配置,也可以在上面添加配置,如 highlightBuilder.field("name").requireFieldMatch(false).postTags("...").preTags("...");

   highlightBuilder.requireFieldMatch(false).preTags(" front color=red ").postTags(" /front

   searchRequest.source().query(

   QueryBuilders.matchQuery("name", "如家")

   ).highlighter(highlightBuilder);

   // 3. 执行操作,获取响应数据

   SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

   // 4. 处理响应数据

   handlerResponse(response);

  
private void handlerResponse(SearchResponse response) throws JsonProcessingException {

   // 1. 得到命中的数量(即总记录数量)

   SearchHits hits = response.getHits();

   long totalCount = hits.getTotalHits().value;// 总记录数

   System.out.println("总记录数量为:" + totalCount);

   // 2. 获取本次查询出来的列表数据

   SearchHit[] hitsArray = hits.getHits();

   for (SearchHit hit : hitsArray) {

   // 得到json字符串

   String json = hit.getSourceAsString();

   // 将json字符串转换为实体类对象

   HotelDoc hotelDoc = objectMapper.readValue(json, HotelDoc.class);

   // 处理高亮的情况

   Map String, HighlightField highlightFields = hit.getHighlightFields();

   if (highlightFields.size() 0) {

   if (highlightFields.get("name") != null) {

   Text nameHighLight = highlightFields.get("name").fragments()[0];

   hotelDoc.setName(nameHighLight.toString());

   if (highlightFields.get("brand") != null) {

   Text brandHighLight = highlightFields.get("brand").fragments()[0];

   hotelDoc.setBrand(brandHighLight.toString());

   System.out.println(hotelDoc);

  

 

 

  以上就是06(06cr19ni10)的详细内容,想要了解更多 06的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: