快速入門
返回結(jié)果直接把json風(fēng)格的結(jié)果封裝為SearchReponse對(duì)象返回
public class HotelSearchTest {
private RestHighLevelClient client;
@Test
void testMatchAll() throws IOException {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
request.source().query(QueryBuilders.matchAllQuery());
//3.發(fā)送請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
System.out.println(response);
}
//執(zhí)行前初始化
@BeforeEach
void setUp(){
this.client=new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://xxx.xxx.xxx.xxx:9200")
//HttpHost.create("http://xxx.xxx.xxx.xxx:9200") 集群時(shí)添加更多的地址
));
}
//銷毀
@AfterEach
void tearDown() throws IOException {
this.client.close();
}
}
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-631068.html
?響應(yīng)結(jié)果解析?
@Test
void testMatchAll() throws IOException {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
request.source().query(QueryBuilders.matchAllQuery());
//3.發(fā)送請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
SearchHits searchHits = response.getHits();
//4.1獲取總條數(shù)
long total = searchHits.getTotalHits().value;
System.out.println("共搜索到"+total+"條數(shù)據(jù)");
//4.2文檔數(shù)組
SearchHit[] hits = searchHits.getHits();
//4.3遍歷
for (SearchHit hit : hits) {
//獲取文檔source
String json = hit.getSourceAsString();
//反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
System.out.println("hotelDoc="+hotelDoc);
}
}
?默認(rèn)只返回前10條數(shù)據(jù)?
?
?
?在.source()中query,排序,分頁(yè),高亮等功能
QueryBuildes中準(zhǔn)備了所有查詢,match,match_all,boolean等
match、term、range、bool查詢
全文檢索查詢
?
@Test
void testMatch() throws IOException {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
request.source().query(QueryBuilders.matchQuery("all","如家"));
//3.發(fā)送請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
SearchHits searchHits = response.getHits();
//4.1獲取總條數(shù)
long total = searchHits.getTotalHits().value;
System.out.println("共搜索到"+total+"條數(shù)據(jù)");
//4.2文檔數(shù)組
SearchHit[] hits = searchHits.getHits();
//4.3遍歷
for (SearchHit hit : hits) {
//獲取文檔source
String json = hit.getSourceAsString();
//反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
System.out.println("hotelDoc="+hotelDoc);
}
}
對(duì)比match和match_all,不同的地方只有一點(diǎn)點(diǎn),這里直接抽取4往后的公共部分,使用ctrl+alt+m抽取
?
public class HotelSearchTest {
private RestHighLevelClient client;
@Test
void testMatchAll() throws IOException {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
request.source().query(QueryBuilders.matchAllQuery());
//3.發(fā)送請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handleResponse(response);
}
@Test
void testMatch() throws IOException {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
request.source().query(QueryBuilders.matchQuery("all","如家"));
//3.發(fā)送請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handleResponse(response);
}
private static void handleResponse(SearchResponse response) {
//4.解析響應(yīng)
SearchHits searchHits = response.getHits();
//4.1獲取總條數(shù)
long total = searchHits.getTotalHits().value;
System.out.println("共搜索到"+total+"條數(shù)據(jù)");
//4.2文檔數(shù)組
SearchHit[] hits = searchHits.getHits();
//4.3遍歷
for (SearchHit hit : hits) {
//獲取文檔source
String json = hit.getSourceAsString();
//反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
System.out.println("hotelDoc="+hotelDoc);
}
}
//執(zhí)行前初始化
@BeforeEach
void setUp(){
this.client=new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://xxx.xxx.xxx.xxx:9200")
//HttpHost.create("http://xxx.xxx.xxx.xxx:9200") 集群時(shí)添加更多的地址
));
}
//銷毀
@AfterEach
void tearDown() throws IOException {
this.client.close();
}
}
?精確查詢
?
一個(gè)boolean查詢里面包含了term查詢和?range查詢
@Test
void testBool() throws IOException {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
//2.1準(zhǔn)備BooleanQuery
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//2.2添加term
boolQuery.must(QueryBuilders.termQuery("city","上海"));
//2.3添加range
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
request.source().query(boolQuery);
//3.發(fā)送請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handleResponse(response);
}
?
?排序和分頁(yè)
@Test
void testPageAndSort() throws IOException {
//前端傳來(lái)頁(yè)碼,每頁(yè)大小
int page=1,size=5;
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
//2.1準(zhǔn)備query
request.source().query(QueryBuilders.matchAllQuery());
//2.2排序 sort
request.source().sort("price", SortOrder.ASC);
//2.3分頁(yè) from,size
request.source().from((page-1)*size).size(5);
//3.發(fā)送請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handleResponse(response);
}
?
高亮
構(gòu)建
@Test
void testHighlight() throws IOException {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
//2.1準(zhǔn)備query
request.source().query(QueryBuilders.matchQuery("all","如家"));
//2.2高亮
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
//3.發(fā)送請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handleResponse(response);
}
?
?
?解析
?逐層解析json結(jié)果
@Test
void testHighlight() throws IOException {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
//2.1準(zhǔn)備query
request.source().query(QueryBuilders.matchQuery("all","如家"));
//2.2高亮
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
//3.發(fā)送請(qǐng)求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handleResponse(response);
}
private static void handleResponse(SearchResponse response) {
//4.解析響應(yīng)
SearchHits searchHits = response.getHits();
//4.1獲取總條數(shù)
long total = searchHits.getTotalHits().value;
System.out.println("共搜索到"+total+"條數(shù)據(jù)");
//4.2文檔數(shù)組
SearchHit[] hits = searchHits.getHits();
//4.3遍歷
for (SearchHit hit : hits) {
//獲取文檔source
String json = hit.getSourceAsString();
//反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
//獲取高亮結(jié)果
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
if(!CollectionUtils.isEmpty(highlightFields)) //判斷map是否為空的工具類
{
//根據(jù)名字獲取高亮結(jié)果
HighlightField highlightField = highlightFields.get("name");
if(highlightField!=null){
//獲取高亮值
String name = highlightField.getFragments()[0].string();
//覆蓋非高亮結(jié)果
hotelDoc.setName(name);
}
}
System.out.println("hotelDoc="+hotelDoc);
}
}
?
?黑馬旅游案例——酒店搜索和分頁(yè)
?定義實(shí)體類
用于接收前端傳來(lái)的參數(shù)
@Data
public class RequestParams {
private String key;
private Integer page;
private Integer size;
private String sortBy;
}
Controller層中
?返回值定義
@Data
public class PageResult {
private Long total;
private List<HotelDoc> hotels;
public PageResult() {
}
public PageResult(Long total, List<HotelDoc> hotels) {
this.total = total;
this.hotels = hotels;
}
}
在啟動(dòng)類中定義一個(gè)Bean
@MapperScan("cn.itcast.hotel.mapper")
@SpringBootApplication
public class HotelDemoApplication {
public static void main(String[] args) {
SpringApplication.run(HotelDemoApplication.class, args);
}
@Bean
public RestHighLevelClient client(){
return new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://xxx.xxx.xxx.xxx:9200")
//HttpHost.create("http://xxx.xxx.xxx.xxx:9200") 集群時(shí)添加更多的地址
));
}
}
@RestController
@RequestMapping("hotel")
public class HotelController {
@Autowired
private IHotelService hotelService;
/**
* 搜索和分頁(yè)
* @param requestParams
* @return
*/
@PostMapping("/list")
public PageResult search(@RequestBody RequestParams requestParams){
return hotelService.search(requestParams);
}
}
?
Service層中
public interface IHotelService extends IService<Hotel> {
PageResult search(RequestParams requestParams);
}
@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {
@Autowired
private RestHighLevelClient client;
@Override
public PageResult search(RequestParams requestParams) {
try {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
//2.1query
String key= requestParams.getKey();
if(key==null||"".equals(key)){ //沒(méi)有查詢內(nèi)容時(shí)直接查詢?nèi)? request.source().query(QueryBuilders.matchAllQuery());
}else {
request.source().query(QueryBuilders.matchQuery("all", key));
}
//2.2分頁(yè)
int page=requestParams.getPage();
int size=requestParams.getSize();
request.source().from((page-1)*size).size(size);
//3.發(fā)送請(qǐng)求
SearchResponse response= client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
handleResponse(response);
return null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private PageResult handleResponse(SearchResponse response) {
//4.解析響應(yīng)
SearchHits searchHits = response.getHits();
//4.1獲取總條數(shù)
long total = searchHits.getTotalHits().value;
System.out.println("共搜索到"+total+"條數(shù)據(jù)");
//4.2文檔數(shù)組
SearchHit[] hits = searchHits.getHits();
//4.3遍歷
List<HotelDoc> hotels=new ArrayList<>();
for (SearchHit hit : hits) {
//獲取文檔source
String json = hit.getSourceAsString();
//反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
hotels.add(hotelDoc);
}
return new PageResult(total,hotels);
}
}
?
成功搜索
?
?黑馬旅游案例——條件過(guò)濾
修改DTO
@Data
public class RequestParams {
private String key;
private Integer page;
private Integer size;
private String sortBy;
private String brand;
private String starName;
private String city;
private Integer minPrice;
private Integer maxPrice;
}
?
Service層中
修改如下,加了多條件過(guò)濾,并抽取出去
@Override
public PageResult search(RequestParams requestParams) {
try {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
//2.1query
buildBasicQuery(requestParams, request);
//2.2分頁(yè)
int page=requestParams.getPage();
int size=requestParams.getSize();
request.source().from((page-1)*size).size(size);
//3.發(fā)送請(qǐng)求
SearchResponse response= client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
return handleResponse(response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static void buildBasicQuery(RequestParams requestParams, SearchRequest request) {
//構(gòu)建BooleanQuery
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//關(guān)鍵字搜索
String key= requestParams.getKey();
if(key==null||"".equals(key)){ //沒(méi)有查詢內(nèi)容時(shí)直接查詢?nèi)? boolQuery.must(QueryBuilders.matchAllQuery());
}else {
boolQuery.must(QueryBuilders.matchQuery("all", key));
}
//城市條件
if(requestParams.getCity()!=null&&!requestParams.getCity().equals("")){
boolQuery.filter(QueryBuilders.termQuery("city", requestParams.getCity()));
}
//品牌條件
if(requestParams.getBrand()!=null&&!requestParams.getBrand().equals("")){
boolQuery.filter(QueryBuilders.termQuery("brand", requestParams.getBrand()));
}
//星級(jí)條件
if(requestParams.getStarName()!=null&&!requestParams.getStarName().equals("")){
boolQuery.filter(QueryBuilders.termQuery("starName", requestParams.getStarName()));
}
//價(jià)格條件
if(requestParams.getMinPrice()!=null&& requestParams.getMaxPrice()!=null){
boolQuery.filter(QueryBuilders.rangeQuery("price")
.gte(requestParams.getMinPrice())
.lte(requestParams.getMaxPrice()));
}
request.source().query(boolQuery);
}
?
?黑馬旅游案例——我附近的酒店
距離排序?
DTO修改
@Data
public class RequestParams {
private String key;
private Integer page;
private Integer size;
private String sortBy;
private String brand;
private String starName;
private String city;
private Integer minPrice;
private Integer maxPrice;
private String location;
}
Service中?
?修改如下
新增2.3部分
@Override
public PageResult search(RequestParams requestParams) {
try {
//1.準(zhǔn)備request
SearchRequest request = new SearchRequest("hotel");
//2.準(zhǔn)備DSl
//2.1query
buildBasicQuery(requestParams, request);
//2.2分頁(yè)
int page=requestParams.getPage();
int size=requestParams.getSize();
request.source().from((page-1)*size).size(size);
//2.3排序
String location = requestParams.getLocation();
if(location!=null&&!location.equals("")){
request.source().sort(SortBuilders
.geoDistanceSort("location",new GeoPoint(location))
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS)
);
}
//3.發(fā)送請(qǐng)求
SearchResponse response= client.search(request, RequestOptions.DEFAULT);
//4.解析響應(yīng)
return handleResponse(response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
DTO修改
@Data
@NoArgsConstructor
public class HotelDoc {
private Long id;
private String name;
private String address;
private Integer price;
private Integer score;
private String brand;
private String city;
private String starName;
private String business;
private String location;
private String pic;
private Object distance;
public HotelDoc(Hotel hotel) {
this.id = hotel.getId();
this.name = hotel.getName();
this.address = hotel.getAddress();
this.price = hotel.getPrice();
this.score = hotel.getScore();
this.brand = hotel.getBrand();
this.city = hotel.getCity();
this.starName = hotel.getStarName();
this.business = hotel.getBusiness();
this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
this.pic = hotel.getPic();
}
}
?Service修改
private PageResult handleResponse(SearchResponse response) {
//4.解析響應(yīng)
SearchHits searchHits = response.getHits();
//4.1獲取總條數(shù)
long total = searchHits.getTotalHits().value;
System.out.println("共搜索到"+total+"條數(shù)據(jù)");
//4.2文檔數(shù)組
SearchHit[] hits = searchHits.getHits();
//4.3遍歷
List<HotelDoc> hotels=new ArrayList<>();
for (SearchHit hit : hits) {
//獲取文檔source
String json = hit.getSourceAsString();
//反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
//獲取排序值
Object[] sortValues = hit.getSortValues();
if(sortValues.length>0){
Object sortValue = sortValues[0];
hotelDoc.setDistance(sortValue);
}
hotels.add(hotelDoc);
}
return new PageResult(total,hotels);
}
這里應(yīng)該成功顯示距離附近酒店以及距離了,但是我的電腦獲取不到位置。?
??黑馬旅游案例——廣告置頂
?DTO修改
在HotelDoc中添加一個(gè)新字段
private Boolean isAD;
ES數(shù)據(jù)修改
?Service層修改
?
private static void buildBasicQuery(RequestParams requestParams, SearchRequest request) {
//1.構(gòu)建BooleanQuery
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//關(guān)鍵字搜索
String key= requestParams.getKey();
if(key==null||"".equals(key)){ //沒(méi)有查詢內(nèi)容時(shí)直接查詢?nèi)? boolQuery.must(QueryBuilders.matchAllQuery());
}else {
boolQuery.must(QueryBuilders.matchQuery("all", key));
}
//城市條件
if(requestParams.getCity()!=null&&!requestParams.getCity().equals("")){
boolQuery.filter(QueryBuilders.termQuery("city", requestParams.getCity()));
}
//品牌條件
if(requestParams.getBrand()!=null&&!requestParams.getBrand().equals("")){
boolQuery.filter(QueryBuilders.termQuery("brand", requestParams.getBrand()));
}
//星級(jí)條件
if(requestParams.getStarName()!=null&&!requestParams.getStarName().equals("")){
boolQuery.filter(QueryBuilders.termQuery("starName", requestParams.getStarName()));
}
//價(jià)格條件
if(requestParams.getMinPrice()!=null&& requestParams.getMaxPrice()!=null){
boolQuery.filter(QueryBuilders.rangeQuery("price")
.gte(requestParams.getMinPrice())
.lte(requestParams.getMaxPrice()));
}
//2.算分控制
FunctionScoreQueryBuilder functionScoreQueryBuilder =
QueryBuilders.functionScoreQuery(
//原始查詢,相關(guān)性算分的查詢
boolQuery,
//function score的數(shù)組
new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
//其中的一個(gè)function score 元素
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
//過(guò)濾條件
QueryBuilders.termQuery("isAD",true),
//算分函數(shù)
ScoreFunctionBuilders.weightFactorFunction(10)
)
});
request.source().query(functionScoreQueryBuilder);
}
最終查詢時(shí)就可以看見置頂?shù)膹V告了
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-631068.html
?
到了這里,關(guān)于微服務(wù)——RestClient查詢文檔的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!