?? 前情提要:
Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ①
目錄
?一、Springboot 整合 Elasticsearch
1、RestHighLevelClient API介紹
1.1、全查詢 & 分頁 & 排序
1.2、單條件查詢
1.2.1、termQuery
1.2.2、matchQuery
1.2.3、短語檢索
1.3、組合查詢
1.4、范圍查詢
1.5、模糊查詢
1.6、分組查詢
一、Springboot 整合 Elasticsearch
1、RestHighLevelClient API介紹
目前的測試數(shù)據(jù)有:
1.1、全查詢 & 分頁 & 排序
@Test
public void queryAllDoc() {
try {
String indexName = "forest";
SearchRequest request = new SearchRequest();
request.indices(indexName);
// 構(gòu)建查詢的請求體
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchAllQuery());
// 設(shè)置分頁
sourceBuilder.from(1);
sourceBuilder.size(3);
// 設(shè)置排序
sourceBuilder.sort("price", SortOrder.DESC);
request.source(sourceBuilder);
SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
if (200 != search.status().getStatus()) {
log.error("查詢失敗");
}
System.out.println("--------查詢結(jié)果-----------");
SearchHits hits = search.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
1.2、單條件查詢
1.2.1、termQuery
term屬于精確匹配,而且只能查單個詞(一個漢字或者一個英文單詞),不會對用戶輸入的內(nèi)容進(jìn)行分詞;
@Test
public void queryDocByKey() {
try {
String indexName = "forest";
SearchRequest request = new SearchRequest();
request.indices(indexName);
// 構(gòu)建查詢的請求體
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("price", "300"));
request.source(sourceBuilder);
SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
if (200 != search.status().getStatus()) {
log.error("查詢失敗");
}
System.out.println("--------查詢結(jié)果-----------");
SearchHits hits = search.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
1.2.2、matchQuery
match進(jìn)行搜索的時候,會先進(jìn)行分詞拆分,拆完后,再來匹配;例如輸入“楓樹”,match會拆分成“楓”,“樹”兩個字,只要包含其中一個字的都會被查出來。
@Test
public void queryDocByKey() {
try {
String indexName = "forest";
SearchRequest request = new SearchRequest();
request.indices(indexName);
// 構(gòu)建查詢的請求體
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("title", "楓樹"));
request.source(sourceBuilder);
SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
if (200 != search.status().getStatus()) {
log.error("查詢失敗");
}
System.out.println("--------查詢結(jié)果-----------");
SearchHits hits = search.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
1.2.3、短語檢索
要求所有的分詞必須同時出現(xiàn)在文檔中,同時位置必須緊鄰一致
@Test
public void queryDocByPhraseKey() {
try {
String indexName = "forest";
SearchRequest request = new SearchRequest();
request.indices(indexName);
// 構(gòu)建查詢的請求體
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchPhraseQuery("title", "楓樹"));
request.source(sourceBuilder);
SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
if (200 != search.status().getStatus()) {
log.error("查詢失敗");
}
System.out.println("--------查詢結(jié)果-----------");
SearchHits hits = search.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
1.3、組合查詢
- must:返回的文檔必須滿足must子句的條件,并且參與計(jì)算分值;
- mustNot:返回的文檔必須不滿足定義的條件;
- should:在一個bool查詢中,如果沒有must或者filter,有一個或者多個should子句,那么只要滿足一個就可以返回;
- filter:返回的文檔必須滿足filter子句的條件,但是不會像must一樣,參與計(jì)算分值;
@Test
public void queryByCombinationKey() {
try {
// 聲明搜索條件對象
String indexName = "forest";
SearchRequest request = new SearchRequest();
request.indices(indexName);
// 構(gòu)建查詢的請求體
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("price", 1000));
boolQueryBuilder.should(QueryBuilders.matchQuery("id", 3));
sourceBuilder.query(boolQueryBuilder);
request.source(sourceBuilder);
SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
if (200 != search.status().getStatus()) {
log.error("查詢失敗");
}
System.out.println("--------查詢結(jié)果-----------");
SearchHits hits = search.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
[注]:當(dāng)使用should查詢時,如果包含了must或者filter查詢,那么should的查詢語句就不是或者的意思了,而是有或者沒有都行的含義。
1.4、范圍查詢
- 閉區(qū)間查詢:QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}).to(${fieldValue2});
- 開區(qū)間查詢:QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}, false).to(${fieldValue2}, false);
- 大于:QueryBuilders.rangeQuery("${fieldName}").gt(${fieldValue});
- 大于等于:QueryBuilders.rangeQuery("${fieldName}").gte(${fieldValue});
- 小于:QueryBuilders.rangeQuery("${fieldName}").lt(${fieldValue});
- 小于等于:QueryBuilders.rangeQuery("${fieldName}").lte(${fieldValue});
@Test
public void queryByCombinationKey() {
try {
// 聲明搜索條件對象
String indexName = "forest";
SearchRequest request = new SearchRequest();
request.indices(indexName);
// 構(gòu)建查詢的請求體
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.rangeQuery("price").from(300).to(500));
boolQueryBuilder.must(QueryBuilders.rangeQuery("inventory").from(500).to(1000));
sourceBuilder.query(boolQueryBuilder);
request.source(sourceBuilder);
SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
if (200 != search.status().getStatus()) {
log.error("查詢失敗");
}
System.out.println("--------查詢結(jié)果-----------");
SearchHits hits = search.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
1.5、模糊查詢
@Test
public void queryFuzzyDocByKey() {
try {
String indexName = "forest";
SearchRequest request = new SearchRequest();
request.indices(indexName);
// 構(gòu)建查詢的請求體
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.fuzzyQuery("title", "松").fuzziness(Fuzziness.AUTO));
request.source(sourceBuilder);
SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
if (200 != search.status().getStatus()) {
log.error("查詢失敗");
}
System.out.println("--------查詢結(jié)果-----------");
SearchHits hits = search.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
1.6、分組查詢
按價格分組后求每組的條數(shù)
@Test
public void queryGroupByKey() {
try {
// 聲明搜索條件對象
String indexName = "forest";
SearchRequest request = new SearchRequest();
request.indices(indexName);
// 構(gòu)建查詢的請求體
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.aggregation(AggregationBuilders.terms("price_groupBy").field("price"));
request.source(sourceBuilder);
SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
if (200 != search.status().getStatus()) {
log.error("查詢失敗");
}
List<KeyAndCount> list = new ArrayList<>();
System.out.println("--------查詢結(jié)果-----------");
Terms terms = search.getAggregations().get("price_groupBy");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
for (Terms.Bucket bucket : buckets) {
KeyAndCount keyAndCount = new KeyAndCount();
keyAndCount.setKey(bucket.getKey().toString());
keyAndCount.setCount(bucket.getDocCount());
list.add(keyAndCount);
System.out.println(keyAndCount);
}
} catch (IOException e) {
e.printStackTrace();
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-847223.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-847223.html
到了這里,關(guān)于Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!