搜索管理的javaAPI方法:几乎都常用
测试类依赖的jar
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.naming.directory.SearchResult;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestSearch {
@Autowired
RestHighLevelClient client;
@Autowired
RestClient restClient;
1.搜索全部记录 matchAllQuery 查询所有索引库的文档。
@Test
//搜索全部记录
public void testSearchAll() throws IOException, ParseException {
//新建一个搜索请求的对象,指向ES中xc_course这张表
SearchRequest searchRequest = new SearchRequest("xc_course");
//指定表的类型,就是那个无意义的type,字段
searchRequest.types("doc");
//搜索源构建对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//指定搜索源的搜索方式
//matchAllQuery搜索全部
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
searchSourceBuilder.fetchSource(new String[]{
"name","studymodel","price","timestamp"},new String[]{
});
//向搜索请求对象中设置搜索源
searchRequest.source(searchSourceBuilder);
//执行搜索,向ES发起http请求,搜索时通过io流去操作,所以需要抛IO异常
//得到结果
SearchResponse searchResponse = client.search(searchRequest);
//把结果解析
SearchHits hits = searchResponse.getHits();
//取匹配到的结果总记录数
long totalHits = hits.getTotalHits();
//得到匹配度高的文档
SearchHit[] searchHits = hits.getHits();
//先创建日期格式化对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//遍历高度匹配的文档
for (SearchHit hit : searchHits) {
//文档的主键
String id = hit.getId();
//源文档内容,源中的数据,封装为map返回
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
//取name这个列的数据,里面的数据你知道是String,所以Object可以强转
String name = (String)sourceAsMap.get("name");
//由于前边设置了源文档字段过虑,这时description是取不到的
String description = (String) sourceAsMap.get("description");
//学习模式
String studymodel = (String) sourceAsMap.get("studymodel");
//价格
Double price = (Double) sourceAsMap.get("price");
//日期,(String)sourceAsMap.get("timestamp")是取得一个时间字符串
// ,需要提前准备好的日期格式化对象,并且抛日期的异常
Date timestamp = simpleDateFormat.parse((String) sourceAsMap.get("timestamp"));
System.err.println(name);
System.err.println(studymodel);
System.err.println(description);
}
}//搜索全部记录
2.分页查询 搜索源设置分页参数
ES支持分页查询,传入两个参数:from和size。
form:表示起始文档的下标,从0开始。
size:查询的文档数量。
@Test
//2.分页查询
public void testSearchPage() throws IOException, ParseException {
//新建一个搜索请求的对象,指向ES中xc_course这张表
SearchRequest searchRequest = new SearchRequest("xc_course");
//指定表的类型,就是那个无意义的type,字段
searchRequest.types("doc");
//搜索源构建对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//设置分页参数
//页码
int page = 1;
//每页记录数
int size = 1;
//计算出记录起始下标
int from = (page-1)*size;
//起始记录下标,从0开始
searchSourceBuilder.from(from);
//每页显示的记录数
searchSourceBuilder.size(size);
//指定搜索源的搜索方式
//matchAllQuery搜索全部
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
searchSourceBuilder.fetchSource(new String[]{
"name","studymodel","price","timestamp"},new String[]{
});
//向搜索请求对象中设置搜索源
searchRequest.source(searchSourceBuilder);
//执行搜索,向ES发起http请求,搜索时通过io流去操作,所以需要抛IO异常
//得到结果
SearchResponse searchResponse = client.search(searchRequest);
//把结果解析
SearchHits hits = searchResponse.getHits();
//取匹配到的结果总记录数
long totalHits = hits.getTotalHits();
//得到匹配度高的文档
SearchHit[] searchHits = hits.getHits();
//先创建日期格式化对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//遍历高度匹配的文档
for (SearchHit hit : searchHits) {
//文档的主键
String id = hit.getId();
//源文档内容,源中的数据,封装为map返回
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
//取name这个列的数据,里面的数据你知道是String,所以Object可以强转
String name = (String)sourceAsMap.get("name");
//由于前边设置了源文档字段过虑,这时description是取不到的
String description = (String) sourceAsMap.get("description");
//学习模式
String studymodel = (String) sourceAsMap.get("studymodel");
//价格
Double price = (Double) sourceAsMap.get("price");
//日期,(String)sourceAsMap.get("timestamp")是取得一个时间字符串
// ,需要提前准备好的日期格式化对象,并且抛日期的异常
Date timestamp = simpleDateFormat.parse((String) sourceAsMap.get("timestamp"));
System.err.println(name);
System.err.println(studymodel);
System.err.println(description);
System.err.println("搜索到条数:"+totalHits);
}
}//分页搜索结束
3.TermQuery,精确查询某个列(常用)
@Test
public void testTermQuery() throws IOException, ParseException {
//新建一个搜索请求的对象,指向ES中xc_course这张表
SearchRequest searchRequest = new SearchRequest("xc_course");
//指定表的类型,就是那个无意义的type,字段
searchRequest.types("doc");
//搜索源构建对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//设置分页参数
//页码
int page = 1;
//每页记录数
int size = 1;
//计算出记录起始下标
int from = (page-1)*size;
//起始记录下标,从0开始
searchSourceBuilder.from(from);
//每页显示的记录数
searchSourceBuilder.size(size);
//指定搜索源的搜索方式
//搜索方式
//******termQuery,精确查询某个列,内容为spring的字符*******
searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));
//设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
searchSourceBuilder.fetchSource(new String[]{
"name","studymodel","price","timestamp"},new String[]{
});
//向搜索请求对象中设置搜索源
searchRequest.source(searchSourceBuilder);
//执行搜索,向ES发起http请求,搜索时通过io流去操作,所以需要抛IO异常
//得到结果
SearchResponse searchResponse = client.search(searchRequest);
//把结果解析
SearchHits hits = searchResponse.getHits();
//取匹配到的结果总记录数
long totalHits = hits.getTotalHits();
//得到匹配度高的文档
SearchHit[] searchHits = hits.getHits();
//先创建日期格式化对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//遍历高度匹配的文档
for (SearchHit hit : searchHits) {
//文档的主键
String id = hit.getId();
//源文档内容,源中的数据,封装为map返回
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
//取name这个列的数据,里面的数据你知道是String,所以Object可以强转
String name = (String)sourceAsMap.get("name");
//由于前边设置了源文档字段过虑,这时description是取不到的
String description = (String) sourceAsMap.get("description");
//学习模式
String studymodel = (String) sourceAsMap.get("studymodel");
//价格
Double price = (Double) sourceAsMap.get("price");
//日期,(String)sourceAsMap.get("timestamp")是取得一个时间字符串
// ,需要提前准备好的日期格式化对象,并且抛日期的异常
Date timestamp = simpleDateFormat.parse((String) sourceAsMap.get("timestamp"));
System.err.println(name);
System.err.println(studymodel);
System.err.println(description);
System.err.println("搜索到条数:"+totalHits);
}
}
4.TermsQuery 根据id精确匹配(常用)
@Test
public void testTermQueryByIds() throws IOException, ParseException {
//新建一个搜索请求的对象,指向ES中xc_course这张表
SearchRequest searchRequest = new SearchRequest("xc_course");
//指定表的类型,就是那个无意义的type,字段
searchRequest.types("doc");
//搜索源构建对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//设置分页参数
//页码
int page = 1;
//每页记录数
int size = 5;
//计算出记录起始下标
int from = (page-1)*size;
//起始记录下标,从0开始
searchSourceBuilder.from(from);
//每页显示的记录数
searchSourceBuilder.size(size);
//指定搜索源的搜索方式
//搜索方式
//根据id查询
//*******定义id数组*******
String[] ids = new String[]{
"1","2"};
//通过 _id 这个列,查询数组内的所有id,返回符合的数据
//*******termsQuery,注意这个方法,比列精确查询多个s。要注意看*******
searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));
//设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
searchSourceBuilder.fetchSource(new String[]{
"name","studymodel","price","timestamp"},new String