測試環境準備 查詢所有文檔 分頁查詢 關鍵字查詢 根據id查詢
matchQuery multiMatchQuery BoolQuery filter過濾器 sort排序 高亮
took:本次操作花費的時間,單位爲毫秒。 timed_out:請求是否超時 _shards:說明本次操作共搜索了哪些分片
hits:搜索命中的記錄 hits.total : 符合條件的文檔總數 hits.hits :匹配度較高的前N個文檔
hits.max_score:文檔匹配得分,這裏爲最高分 _score:每個文檔都有一個匹配度得分,按照降序排列。
_source:顯示了文檔的原始內容。
測試環境準備
1.創建xc_course 索引庫 2.創建映射配置 3.插入三條文檔
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestSearch {
@Autowired
RestHighLevelClient client;
@Autowired
RestClient restClient;
}
查詢所有文檔
1.構建 searchRequest 搜索請求對象 2.設置請求對象的搜索對象的類型
3.構建搜索源對象searchSourceBuilder 4.設置搜索源對象的搜索方式 5.設置搜索源對象的過濾條件
6.向搜索請求對象中設置 搜索源對象 7.執行搜索,獲得搜索結果對象searchResponse
8.獲得搜索結果數組 SearchHits [ ]
@Test
public void testSearchAll() throws Exception {
//構建搜索請求對象
SearchRequest searchRequest = new SearchRequest("xc_course");
//設置搜索對象的類型
searchRequest.types("doc");
//構建搜索源對象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//搜索源搜索方式
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
//過濾條件 第一個要顯示的字段,第二個不顯示的
searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
//向搜索請求對象中設置搜索源
searchRequest.source(searchSourceBuilder);
//執行搜索,向ES發起Http請求,獲得結果對象
SearchResponse searchResponse = client.search(searchRequest);
//搜索結果
SearchHits hits = searchResponse.getHits();
//獲得匹配總記錄
long totalHits = hits.getTotalHits();
//得到匹配度高的文檔
SearchHit[] searchHits = hits.getHits();
//日期格式化對象
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for(SearchHit hit:searchHits){
//文檔的主鍵
String id = hit.getId();
//源文檔內容
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
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");
//日期
Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
System.out.println(name);
System.out.println(studymodel);
System.out.println(description);
}
}
分頁查詢
只用在構建搜索源對象後設置參數 即可
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
int page = 1;
//每頁記錄數
int size = 1;
//計算出記錄起始下標
int from = (page-1)*size;
searchSourceBuilder.from(from);//起始記錄下標,從0開始
searchSourceBuilder.size(size);//每頁顯示的記錄數
//搜索源搜索方式
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
關鍵字查詢
設置搜索源對象的查詢方式爲 termQuery("name","Spring") 表示查詢字段爲name的 關鍵字爲Spring
searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));
//設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
//向搜索請求對象中設置搜索源
searchRequest.source(searchSourceBuilder);
//執行搜索,向ES發起http請求
SearchResponse searchResponse = client.search(searchRequest);
//搜索結果
SearchHits hits = searchResponse.getHits();
//匹配到的總記錄數
long totalHits = hits.getTotalHits();
//得到匹配度高的文檔
SearchHit[] searchHits = hits.getHits();
根據id查詢
可以根據多個id查詢 所以searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids)); 中傳入一個數組
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//搜索方式 根據id查詢
String[] ids = new String[]{"1","2"};
searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));
//設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
//向搜索請求對象中設置搜索源
searchRequest.source(searchSourceBuilder);
matchQuery
匹配查詢 匹配字段 description 搜索關鍵字 spring 開發 框架會被分詞爲三個
minimumShouldMatch 爲匹配度 0.8*3 =2.4 向下取整 2 所以在 description字段中只要有兩個詞就算匹配成功
QueryBuilders.matchQuery("description","spring開發框架").minimumShouldMatch("80%"))
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//搜索方式MatchQuery
searchSourceBuilder.query(QueryBuilders.matchQuery("description","spring開發框架")
.minimumShouldMatch("80%"));
//設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
//向搜索請求對象中設置搜索源
searchRequest.source(searchSourceBuilder);
multiMatchQuery
匹配搜索多個字段
QueryBuilders.multiMatchQuery("spring css","name","description") .minimumShouldMatch("50%") .field("name",10)
設置搜索方式時,使用multiMatchQuery 第一個參數: 搜索的關鍵字 第二個參數可以爲多個: 要搜索的字段(filed)
使用minimumShouldMatch 設置匹配度 這裏是只要有一個詞就算
field 提升name 字段的得分 權限 每個結果搜索出來後都會有一個得分 這裏設置name屬性 提升10倍的得分
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//搜索方式
//MultiMatchQuery
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("spring css","name","description")
.minimumShouldMatch("50%")
.field("name",10));
//設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
//向搜索請求對象中設置搜索源
searchRequest.source(searchSourceBuilder);
BoolQuery
用於組合查詢上述的查詢方式
1.定義一個 MultiMatchQueryBuilder 2.定一個 TermQueryBuilder 3.定一個BoolQueryBuilder
4.使用 BoolQueryBuilder 將他們組合起來
boolQueryBuilder.must(multiMatchQueryBuilder); boolQueryBuilder.must(termQueryBuilder);
5.將 BoolQueryBuilder 放入searchSourceBuilder() 設置查詢方式
@Test
public void testBoolQuery() throws IOException, ParseException {
//搜索請求對象
SearchRequest searchRequest = new SearchRequest("xc_course");
//指定類型
searchRequest.types("doc");
//搜索源構建對象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//boolQuery搜索方式
//先定義一個MultiMatchQuery
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
.minimumShouldMatch("50%")
.field("name", 10);
//再定義一個termQuery
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201001");
//定義一個boolQuery
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(multiMatchQueryBuilder);
boolQueryBuilder.must(termQueryBuilder);
searchSourceBuilder.query(boolQueryBuilder);
}
filter過濾器
BoolQueryBuilder 不僅可以組合 普通的查詢 還可以組合過濾器 性能更高 對查詢出來的結果進行過濾
boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel","201001")); 表示 只需要 studymodel字段爲 201001的
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(90).lte(100)); 表示過濾價格 大於等於90 小於等於100的
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//boolQuery搜索方式 先定義一個MultiMatchQuery
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
.minimumShouldMatch("50%")
.field("name", 10);
//定義一個boolQuery
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(multiMatchQueryBuilder);
//定義過慮器
boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel","201001"));
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(90).lte(100));
searchSourceBuilder.query(boolQueryBuilder);
sort排序
對查詢後結果進行排序, searchSourceBuilder 使用
searchSourceBuilder.sort("studymodel", SortOrder.DESC);
searchSourceBuilder.sort("price", SortOrder.ASC);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//boolQuery搜索方式
//定義一個boolQuery
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//定義過慮器
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));
searchSourceBuilder.query(boolQueryBuilder);
//添加排序
searchSourceBuilder.sort("studymodel", SortOrder.DESC);
searchSourceBuilder.sort("price", SortOrder.ASC);
高亮
1. 定義高亮對象 HighlightBuilder( )
2.在關鍵字前,後 設置標籤 highlightBuilder.preTags("<span style="color="red">"); highlightBuilder.postTags("<span style="color="red">");
3.設置需要高亮的字段 highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
4.設置源數據 高亮 searchSourceBuilder.highlighter(highlightBuilder);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//boolQuery搜索方式先定義一個MultiMatchQuery
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("開發框架", "name", "description")
.minimumShouldMatch("50%")
.field("name", 10);
//定義一個boolQuery
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(multiMatchQueryBuilder);
//定義過慮器
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));
searchSourceBuilder.query(boolQueryBuilder);
//設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段
searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
//設置高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<tag>");
highlightBuilder.postTags("</tag>");
highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
// highlightBuilder.fields().add(new HighlightBuilder.Field("description"));
searchSourceBuilder.highlighter(highlightBuilder);
//向搜索請求對象中設置搜索源
searchRequest.source(searchSourceBuilder);
//執行搜索,向ES發起http請求
SearchResponse searchResponse = client.search(searchRequest);
綜合結構圖
{
"_source" : [ "name", "studymodel", "description","price"],
"query": {
"bool" : {
"must":[
{
"multi_match" : {
"query" : "開發框架",
"minimum_should_match": "50%",
"fields": [ "name^10", "description" ],
"type":"best_fields"
}
}
],
"filter": [
{ "range": { "price": { "gte": 0 ,"lte" : 100}}}
]
}
},
"sort" : [
{
"price" : "asc"
}
],
"highlight": {
"pre_tags": ["<tag1>"],
"post_tags": ["</tag2>"],
"fields": {
"name": {},
"description":{}
}
}
}