DSL Query基本語法
1,查詢所有數(shù)據(jù)matchall(當然并不是會顯示所有數(shù)據(jù))
#查詢所有數(shù)據(jù)
GET /索引名/_search
{
"query": {
"查詢類型": {
"查詢條件":"條件值"
}
}
}
?2,全文搜索檢索-分詞搜索
match查詢:全文檢索查詢的一種,會對用戶內容分詞,然后去倒排索引庫檢索,語法。
#根據(jù)條件查詢 match
GET /索引名/_search
{
"query": {
"查詢類型": {
"查詢那個字段": "查詢的具體值"
}
}
}
# 示例
GET /hotel/_search
{
"query": {
"match": {
"all": "北京"
}
}
}
multi_match:和match類似,但是它允許多個字段進行查詢
# 根據(jù)多個字段來搜 multi_match
GET /索引名/_search
{
"query": {
"查詢類型": {
"query": "需要查詢字段的具體值",
"fields": ["查詢字段1","查詢字段2"]
}
}
}
# 根據(jù)多個字段來搜 multi_match
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "北京",
"fields": ["city","name"]
}
}
}
解釋:在hotel索引庫中按照address和name兩個字段搜索值包含北京的文檔
3,精準查詢
精準查詢一般是查找keyword,數(shù)值,日期,boolean等不可分割的字段。
term:根據(jù)詞條精準查詢
range:根據(jù)值的范圍查詢
term查詢
#精準查詢-term
GET /索引名/_search
{
"query": {
"查詢類型": {
"查詢字段": {
"value": "查詢的具體值"
}
}
}
}
#精準查詢-term
GET /hotel/_search
{
"query": {
"term": {
"city": {
"value": "上海"
}
}
}
}
解釋:在hotel索引庫中查找city的值等于上海的所有文檔,(city值一定是上海)
range查詢-范圍查詢
#精準查詢-范圍查詢range
GET /索引名/_search
{
"query": {
"查詢類型": {
"查詢字段": {
"gte": 最小值,
"lte": 最大值
}
}
}
}
GET /hotel/_search
{
"query": {
"range": {
"score": {
"gte": 10,
"lte": 45
}
}
}
}
解釋:在hotel索引庫中查詢score的值大于等于10小于等于45的文檔。
4,復合查詢
復合查詢:復合查詢可以將其他簡單查詢組合起來,實現(xiàn)更復雜的邏輯,例如:
funcation_score:算分函數(shù)查詢,可以根據(jù)某些規(guī)則(打分算法)計算文檔得分
1,funcation score Query
例如:
#修改得分
GET /hotel/_search
{
"query": {
"function_score": {
"query": {
"match": {
"all": "北京"
}
},
"functions": [
{
"filter": {
"term": {
"brand": "如家"
}
},
"weight": 10
}
],
"boost_mode": "multiply"
}
}
}
解釋:查詢索引庫為hotel索引庫,查詢字段為all,值為北京,過濾brand為如家的文檔,得分方式為默認,乘10.
2,Boolean Query
布爾查詢是一個或者多個子句的組合子查詢的組合方式有
must:必須匹配每個子查詢,類似“與
should:選擇性匹配子查詢,類似“或
must_not:必須不匹配,不參與算分,類似“非
filter:必須匹配,不參與算分
例如,查詢名字包含如家,價格不高于400的酒店
# 使用bool查詢功能
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "如家"
}
}
],
"must_not": [
{
"range": {
"range": {
"gt": 400
}
}
}
]
}
}
}
使用RestClient進行query查詢
建議在上一篇博客基礎上進行
RestClient操作Elasticsearch(Java)-CSDN博客文章瀏覽閱讀838次,點贊30次,收藏12次。Es官方提供了各種不用語言的客戶端,用來操作Es,這些客戶端的本質就是組裝DSL語句,通過http請求發(fā)送給Es,從而簡化操作es基礎篇不熟悉參考一下博客:ElasticSearch入門篇-CSDN博客Elasticsearch是一個開源的高擴展的分布式全文檢索引擎,它可以近乎實時的存儲、檢索數(shù)據(jù);本身擴展性很好,可以擴展到上百臺服務器,處理PB級別的數(shù)據(jù)。https://blog.csdn.net/qq_63837759/article/details/137755058?spm=1001.2014.3001.5501
全文檢索查詢-分詞搜索
會在倒排索引庫中做分詞匹配,類似于模糊查詢
因為最后的結果需要解析,于是為了后續(xù)代碼的簡潔,我們把解析的代碼單獨書寫出來,這里用的是fastJson:
/**
*用來解析返回的數(shù)據(jù),包含高亮處理(針對的是name字段)
* @param searchResponse 發(fā)送請求之后的響應
*/
void parseData( SearchResponse searchResponse){
//解析拿到的數(shù)據(jù)
//有用的數(shù)據(jù)都在這個對象里面
SearchHits hits = searchResponse.getHits();
//獲取數(shù)據(jù)總數(shù)
long total = hits.getTotalHits().value;
System.out.println("數(shù)據(jù)總數(shù):"+total);
//這個數(shù)組里面存放的是每一條數(shù)據(jù)
SearchHit[] searchHits = hits.getHits();
for (SearchHit documentFields : searchHits) {
String sourceJson = documentFields.getSourceAsString();
HotelDoc hotelDoc = JSON.parseObject(sourceJson, HotelDoc.class);
//進行高亮的結果解析
Map<String, HighlightField> highlightFieldMap = documentFields.getHighlightFields();
if(!CollectionUtils.isEmpty(highlightFieldMap)){
HighlightField highlightField = highlightFieldMap.get("name");
if(highlightField!=null){
//獲取高亮處理后的name
String name = highlightField.fragments()[0].string();
hotelDoc.setName(name);
}
}
System.out.println(hotelDoc);
}
}
1,matchAll查詢(查詢所有數(shù)據(jù),但是只返回十條)
@Test
void matchAllTest() throws IOException {
//1,創(chuàng)建請求
SearchRequest request=new SearchRequest("hotel");
//2,準備請求參數(shù)
request.source().query(QueryBuilders.matchAllQuery());
//3,發(fā)送請求
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
//4,解析拿到的數(shù)據(jù)
parseData(searchResponse);
}
2,match查詢(根據(jù)一個字段進行查詢)
/**
* match查詢,可以指定字段及逆行查詢,但是只能指定一個
* @throws IOException
*/
@Test
void matchTest() throws IOException {
//1,創(chuàng)建請求
SearchRequest request=new SearchRequest("hotel");
//2,準備請求參數(shù),針對all字段,對所有all中包含北京的進查詢
request.source().query(QueryBuilders.matchQuery("all","北京"));
//因為es默認返回十條數(shù)據(jù),我們如果向返回多一點,可以設置返回的數(shù)量
request.source().size(20);
//3,發(fā)送請求
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
//4,解析拿到的數(shù)據(jù)
parseData(searchResponse);
}
3,multi_match:(和match類似,但允許對多個字段進行查詢)
/**
* multiMatch查詢,可以指定多個字段
* @throws IOException
*/
@Test
void multiMatchTest() throws IOException {
SearchRequest request =new SearchRequest("hotel");
//指定查詢字段的值是多少,并指定那個字段,可以有多個,我們這里指定name,和city
request.source().query(QueryBuilders.multiMatchQuery("北京","name","city"));
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
parseData(searchResponse);
}
精準查詢
精準查詢-字段基本上是keyword類型的不可以在分詞
term查詢
/**
* term查詢-根據(jù)詞條精準查詢
* @throws IOException
*/
@Test
void termTest() throws IOException {
SearchRequest request =new SearchRequest("hotel");
//指定查詢字段的值是多少,并指定那個字段,這個查詢的值是固定的完全匹配的
request.source().query(QueryBuilders.termQuery("city","上海"));
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
parseData(searchResponse);
}
range查詢
/**
* range查詢-根據(jù)條件范圍插尋
* @throws IOException
*/
@Test
void rangTest() throws IOException {
SearchRequest request =new SearchRequest("hotel");
//指定詞條進行范圍插尋,查找評分從20到40 的酒店
request.source().query(QueryBuilders.rangeQuery("score").gt(20).lt(40));
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
parseData(searchResponse);
}
對查詢結果做排序分頁
/**
* 針對查詢結果做排序和分頁
* @throws IOException
*/
@Test
void PageSortTest() throws IOException {
int page=3;
int size=5;
SearchRequest request =new SearchRequest("hotel");
//使用matchall查詢所有酒店
request.source().query(QueryBuilders.matchAllQuery());
//對查詢結果進行排序和分頁,from:第幾頁。size;每頁大小
request.source().from((page-1)*size).size(size);
//排序,針對價格字段降序,從高到低
request.source().sort("price", SortOrder.DESC);
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
parseData(searchResponse);
}
對查詢結果做高亮處理
/**
* 對查詢結果高亮處理
* @throws IOException
*/
@Test
void HignLightTest() throws IOException {
SearchRequest request =new SearchRequest("hotel");
//指定詞條進行范圍插尋,查找all字段中包含如家的酒店
request.source().query(QueryBuilders.matchQuery("all","如家"));
//查詢后的name字段高亮處理,可以指定多個字段進行高亮
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
parseData(searchResponse);
}
至此,es基礎查詢完結,了解更多,可查看官方文檔!?。?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-858009.html
Quick start | Elasticsearch Guide [8.13] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html文章來源地址http://www.zghlxwxcb.cn/news/detail-858009.html
到了這里,關于Elasticsearch常用查詢語法及RestClient操作的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!