keyword、数值、日期类型排序的语法基本一致;DSL语法如下所示
GET /indexName/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"FIELD": "desc" // 排序字段、排序方式ASC、DESC
}
]
}
排序条件是一个数组,也就是可以写多个排序条件;按照声明的排序,当第一个条件相等的时候,再按照第二个条件排序,依次类推
示例
酒店数据按照用户评价(score)降序排序,评价相同的按照价格(price)升序排序
DSL语句如下所示(match处是自定义的,也可以直接使用match_all)
GET hotel/_search
{
"query": {
"match": {
"name": "酒店"
}
},
"sort": [
{
"score": {
"order": "desc"
}
},
{
"price": {
"order": "asc"
}
}
],
"size": 100
}
运行结果如下所示

地理坐标排序跟上面的普通字段排序略有不同,DSL语法格式如下所示
GET /indexName/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance" : {
"FIELD" : "纬度,经度", // 文档中geo_point类型的字段名、目标坐标点
"order" : "asc", // 排序方式
"unit" : "km" // 排序的距离单位
}
}
]
}
这个查询的含义是
geo_point类型)的坐标,到目标点的距离是多少示例
实现对酒店数据按照自己的位置坐标的距离升序排序
假设我的位置坐标是:113.266022,22.995959,寻找周围距离最近的酒店的DSL语句如下所示(location字段也可以不使用大括号,直接使用字符串)
GET hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 22.995959,
"lon": 113.266022
},
"order": "asc",
"unit": "km"
}
}
]
}
运行结果如下所示

代码如下所示
/**
* 普通字段排序查询
*/
@Test
public void testCommonFieldSortQuery() throws IOException {
// 1. 创建查询请求对象
SearchRequest searchRequest = new SearchRequest("hotel");
// 2. 添加查询请求体
searchRequest.source().query(
QueryBuilders.matchAllQuery()
).sort(
SortBuilders.fieldSort("score").order(SortOrder.DESC)
).sort(
SortBuilders.fieldSort("price").order(SortOrder.ASC)
);
// 3. 执行查询,获取响应结果
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 4. 处理响应数据
handlerCommonResponse(response);
}
/**
* 用来处理响应数据(相当于解析返回的JSON数据)
* @param 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);
}
}
代码如下所示
/**
* 地理坐标排序测试
*/
@Test
public void testGeoDistanceSortQuery() throws IOException {
// 1. 创建查询请求体
SearchRequest searchRequest = new SearchRequest("hotel");
// 2. 添加查询请求体
searchRequest.source().query(
QueryBuilders.matchAllQuery()
).sort(
SortBuilders.geoDistanceSort(
"location",
new GeoPoint(22.995959,113.266022)
).order(SortOrder.ASC).unit(DistanceUnit.KILOMETERS)
);
// 3. 执行查询,获取响应数据
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 4. 处理响应结果
handlerGeoResponse(response);
}
/**
* 用来处理响应数据(相当于解析返回的JSON数据)
* @param 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);
}
}
from、size参数来控制要返回的分页结果
from:从第几个文档开始,从0开始size:总共查询几个文档limit ?, ?
代码如下所示
package com.coolman.hotel.test;
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);
}
/**
* 用来处理响应数据(相当于解析返回的JSON数据)
* @param 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);
}
}
}


<em>标签<em>标签编写CSS样式语法格式
GET /indexName/_search
{
"query": {
"match": {
"FIELD": "TEXT" // 查询条件,高亮一定要使用全文检索查询
}
},
"highlight": {
"fields": { // 指定要高亮的字段
"FIELD": {
"pre_tags": "<em>", // 用来标记高亮字段的前置标签 ,默认使用<em>标签
"post_tags": "</em>" // 用来标记高亮字段的后置标签
}
}
}
}
注意
required_field_match=false示例
需求:让酒店搜索结果的name字段高亮显示关键词
DSL语句如下所示
# 高亮显示
# 需求:让酒店搜索结果的name字段高亮显示关键词
# fields: 指定需要高亮显示的字段名
# pre_tags: 样式前缀 不指定的话,就默认是<em>标签
# post_tags:样式后缀
# require_field_match:
# true 代表高亮字段必须出现在条件中,才可以高亮
# false代表高亮字段不一定要出现在条件,也可以高亮
GET hotel/_search
{
"query": {
"match": {
"name": "如家"
}
},
"highlight": {
"fields": {
"brand": {},
"name": {}
},
"require_field_match": "false",
"pre_tags": "<front color='red'>",
"post_tags": "</front>"
}
}
查询结果如下所示

require_field_match、pre_tags、post_tags都可以放在字段中代码如下所示,可以参考DSL语句的格式来写
package com.coolman.hotel.test;
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);
}
/**
* 用来处理响应数据(相当于解析返回的JSON数据)
* @param 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);
}
}
}
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是rubygems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和rubygems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko
我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我读了"BingSearchAPI-QuickStart"但我不知道如何在Ruby中发出这个http请求(Weary)如何在Ruby中翻译“Stream_context_create()”?这是什么意思?"BingSearchAPI-QuickStart"我想使用RubySDK,但我发现那些已被弃用前(Rbing)https://github.com/mikedemers/rbing您知道Bing搜索API的最新包装器(仅限Web的结果)吗? 最佳答案 好吧,经过一个小时的挫折,我想出了一个办法来做到这一点。这段代码很糟糕,因为它是
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题: