国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Elasticsearch(十一)搜索---搜索匹配功能②--range查詢和exists查詢

這篇具有很好參考價值的文章主要介紹了Elasticsearch(十一)搜索---搜索匹配功能②--range查詢和exists查詢。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、前言

繼上一節(jié)學習了ES的搜索的查詢全部和term搜索后,此節(jié)將把搜索匹配功能剩余的2個學習完,分別是range搜索和exists搜索

二、range范圍搜索

range查詢用于范圍查詢,一般是對數值型和日期型數據的查詢。使用range進行范圍查詢時,用戶可以按照需求中是否包含邊界數值進行選項設置,可供組合的選項如下:

  • gt:大于;
  • lt 小于;
  • gte 大于等于;
  • lte 小于等于;

其請求形式如下:

GET /hotel/_search
{
 
 "query": {
   "range": {
     "FIELD": {   //需要范圍查詢的列
       "gte": "${VALUE1}",   //大于等于value1
       "lte": "${VALUE2}"    //小于等于value2
     }
   }
 }
}

以下是數值類型的查詢示例,查詢住宿價格在500~600(包含邊界值)元的酒店:

GET /hotel/_search
{
 
 "query": {
   "range": {
     "price": {
       "gte": "500",
       "lte": "600"
     }
   }
 }
}

ES返回的數據如下:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "001",
        "_score" : 1.0,
        "_source" : {
          "title" : "文雅酒店",
          "city" : "北京",
          "price" : "558.00",
          "create_time" : "2020-03-29 21:00:00",
          "amenities" : "浴池,普通停車場/充電停車場",
          "full_room" : true,
          "location" : {
            "lat" : 36.940243,
            "lon" : 120.394
          },
          "praise" : 10
        }
      },
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "006",
        "_score" : 1.0,
        "_source" : {
          "title" : "京盛集團精選酒店",
          "city" : "上海",
          "price" : "500.00",
          "create_time" : "2022-01-29 22:50:00",
          "full_room" : true,
          "location" : {
            "lat" : 40.918229,
            "lon" : 118.422011
          },
          "praise" : 20
        }
      }
    ]
  }
}

如果我需要查詢大于500元(不包含邊界值)的酒店:

GET /hotel/_search
{
 
 "query": {
   "range": {
     "price": {
       "gt": "500"
     }
   }
 }
}

注意,使用range查詢時,查詢值必須符合該字段在mappings中設置的規(guī)范。例如,在酒店索引中,price字段是double類型,則range應該使用數值型或者數值類型的字符串形式,不能使用其他形式。以下示例將導致ES返回錯誤:

GET /hotel/_search
{
 
 "query": {
   "range": {
     "price": {
       "gt": "abc"
     }
   }
 }
}

執(zhí)行上述DSL后,ES返回信息如下:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "query_shard_exception",
        "reason" : "failed to create query: For input string: \"abc\"",
        "index_uuid" : "az-MqIf9QM6asEIfivIBLQ",
        "index" : "hotel"
      }
    ],
    "type" : "search_phase_execution_exception",   //range查詢解析異常
    "reason" : "all shards failed",
    "phase" : "query",
    "grouped" : true,
    "failed_shards" : [
      {
        "shard" : 0,
        "index" : "hotel",
        "node" : "ER773I31Sx-wJuJwJCh7Ng",
        "reason" : {
          "type" : "query_shard_exception",
          //構建range查詢時出現異常
          "reason" : "failed to create query: For input string: \"abc\"",
          "index_uuid" : "az-MqIf9QM6asEIfivIBLQ",
          "index" : "hotel",
          "caused_by" : {
          //字符串類型不能轉換為range查詢對應的數值型數據
            "type" : "number_format_exception",
            "reason" : "For input string: \"abc\""
          }
        }
      }
    ]
  },
  "status" : 400
}

和term查詢類似,查詢日期型的字段時,需要遵循該字段在mappings中定義的格式進行查詢。例如create_time使用的格式為"yyyy-MM-dd HH:mm:ss",則range查詢應該使用如下方式:

GET /hotel/_search
{
 
 "query": {
   "range": {
     "create_time": {
       "gte": "2021-02-27 22:00:00",
       "lte": "2024-02-27 22:00:00"
     }
   }
 }
}

在Java客戶端上構建range請求是使用QueryBuilders.rangeQuery()方法實現的,該方法的參數為字段名稱,然后再調用對應的方法即可構建相應的查詢范圍??梢哉{用gt()、lt()、gte()、lte()等方法分別實現大于、小于、大于等于、小于等于等查詢范圍。在使用時支持鏈式編程,可以連著使用"."操作符,這樣不用拆分語句,也比較容易理解,一下通過range查詢完成一個createTime大于等于輸入的createTimeStart和小于等于createEnd的一個范圍查詢
Service層:

		public List<Hotel> rangeQuery(HotelDocRequest hotelDocRequest) throws IOException {
		//新建搜索請求
		String indexName = hotelDocRequest.getIndexName();
		if (CharSequenceUtil.isBlank(indexName)) {
			throw new SearchException("索引名不能為空");
		}
		SearchRequest searchRequest = new SearchRequest(indexName);
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		Date createTimeStart = hotelDocRequest.getCreateTimeStart();
		String createTimeStartToSearch = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTimeStart);
		Date createTimeEnd = hotelDocRequest.getCreateTimeEnd();
		String createTimeEndToSearch = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTimeEnd);
		searchSourceBuilder.query(QueryBuilders.rangeQuery("create_time").gte(createTimeStartToSearch).lte(createTimeEndToSearch));
		searchRequest.source(searchSourceBuilder);
		return getQueryResult(searchRequest);
	}

Controller層:

	@PostMapping("/query/range")
	public FoundationResponse<List<Hotel>> rangeQuery(@RequestBody HotelDocRequest hotelDocRequest) {
		try {
			List<Hotel> hotelList = esQueryService.rangeQuery(hotelDocRequest);
			if (CollUtil.isNotEmpty(hotelList)) {
				return FoundationResponse.success(hotelList);
			} else {
				return FoundationResponse.error(100,"no data");
			}
		} catch (IOException e) {
			log.warn("搜索發(fā)生異常,原因為:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		} catch (Exception e) {
			log.error("服務發(fā)生異常,原因為:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		}
	}

postman調用該接口:
Elasticsearch(十一)搜索---搜索匹配功能②--range查詢和exists查詢

三、exists查詢

在某些場景下,我們希望找到某個字段不為空的文檔,則可以用exists搜索。字段不為空的條件有:

  • 值存在且不是null
  • 值不是空數組
  • 值是數組,但不是[null]

為方便測試,給索引hotel增加tag字段,DSL如下:

POST /hotel/_mapping
{
    "properties": {
      "tag":{
        "type": "keyword"
      }
    }
}

下面向該索引中分別寫入3條字段為空的數據。
添加tag字段值為null的文檔,DSL如下:

POST /hotel/_create/020
{
  "title":"環(huán)球酒店",
  "tag":null
}

添加tag字段是空數組的文檔,DSL如下:

POST /hotel/_create/021
{
  "title":"環(huán)球酒店2",
  "tag":[]
}

添加tag為數組,其中只有一個元素,且該元素為null的文檔,DSL如下:

POST /hotel/_create/022
{
  "title":"環(huán)球酒店3",
  "tag":[null]
}

上面3種情況的數據使用exists查詢都不命中,查詢的DSL如下:

GET /hotel/_search
{
  "query": {
    "exists": {
      "field": "tag"
    }
  }
}

返回結果如下:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,          //命中的文檔個數為0
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]   //命中的文檔集合為空
  }
}

在java客戶端中進行查詢時,可以調用QueryBuilders.existsQuery(String name)方法新建一個exists查詢,傳遞的name參數是目標字段名稱。以下是使用Java客戶端構建exists查詢的示例:
service層:

	public List<Hotel> existQuery(HotelDocRequest hotelDocRequest) throws IOException {
		//新建搜索請求
		String indexName = hotelDocRequest.getIndexName();
		String propertiesName = hotelDocRequest.getPropertiesName();
		if (CharSequenceUtil.isBlank(indexName)) {
			throw new SearchException("索引名不能為空");
		}
		if (CharSequenceUtil.isBlank(propertiesName)) {
			throw new SearchException("想要查詢的字段名不能為空");
		}
		SearchRequest searchRequest = new SearchRequest(indexName);
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		searchSourceBuilder.from(hotelDocRequest.getOffset());
		searchSourceBuilder.size(hotelDocRequest.getLimit());
		searchSourceBuilder.query(QueryBuilders.existsQuery(propertiesName));
		searchRequest.source(searchSourceBuilder);
		return getQueryResult(searchRequest);
	}

controller層:

	@PostMapping("/query/exist")
	public FoundationResponse<List<Hotel>> existQuery(@RequestBody HotelDocRequest hotelDocRequest) {
		try {
			List<Hotel> hotelList = esQueryService.existQuery(hotelDocRequest);
			if (CollUtil.isNotEmpty(hotelList)) {
				return FoundationResponse.success(hotelList);
			} else {
				return FoundationResponse.error(100,"no data");
			}
		} catch (IOException e) {
			log.warn("搜索發(fā)生異常,原因為:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		} catch (Exception e) {
			log.error("服務發(fā)生異常,原因為:{}", e.getMessage());
			return FoundationResponse.error(100, e.getMessage());
		}
	}

postman調用即可,比如搜索之前tag字段:
沒有搜到,所以報了no data
Elasticsearch(十一)搜索---搜索匹配功能②--range查詢和exists查詢
如果搜索title,則會將title不為null的值全部搜索出來,由于title不為空的比較多,我這邊只查前3條:
Elasticsearch(十一)搜索---搜索匹配功能②--range查詢和exists查詢文章來源地址http://www.zghlxwxcb.cn/news/detail-493873.html

到了這里,關于Elasticsearch(十一)搜索---搜索匹配功能②--range查詢和exists查詢的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【ES筆記02】ElasticSearch數據庫之查詢操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)

    【ES筆記02】ElasticSearch數據庫之查詢操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)

    這篇文章,主要介紹ElasticSearch數據庫之查詢操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)。 目錄 一、布爾查詢 1.1、主鍵查詢 1.2、兩種查詢方式 (1)路徑參數查詢 (2)請求體參數查詢 1.3、match查詢 (1)match (2)match_all 1.4、過濾字段 1.5、布

    2023年04月09日
    瀏覽(85)
  • Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

    Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

    不同于之前的term。terms等結構化查詢,全文搜索首先對查詢詞進行分析,然后根據查詢詞的分詞結果構建查詢。這里所說的全文指的是文本類型數據(text類型),默認的數據形式是人類的自然語言,如對話內容、圖書名稱、商品介紹和酒店名稱等。結構化搜索關注的是數據是

    2024年02月11日
    瀏覽(19)
  • ElasticSearch系列 - SpringBoot整合ES之全文搜索匹配查詢 match

    官方文檔地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html 權威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search.html 1. 數據準備 官方測試數據下載地址:https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip ,數據量很大,我們自己構造數據吧。 2. m

    2023年04月08日
    瀏覽(31)
  • Elasticsearch (ES) 搜索引擎: 搜索功能:搜索分頁、搜索匹配、全文搜索、搜索建議、字段排序

    原文鏈接:https://xiets.blog.csdn.net/article/details/132348920 版權聲明:原創(chuàng)文章禁止轉載 專欄目錄:Elasticsearch 專欄(總目錄) ES 搜索 API 官網文檔:Search APIs 先創(chuàng)建一個索引,并寫入一些文檔用于搜索示例: 寫入一些文檔示例: 官網API:The _source option 搜索結果中的文檔數據封裝

    2024年02月08日
    瀏覽(32)
  • Elasticsearch查詢 - Range查詢

    Range查詢可以查詢一個范圍內的文檔。它可以用來查詢數值型字段、日期型字段、字符串型字段等等。 我們可以使用range查詢來查詢符合一定范圍內的數據,如查詢某個價格區(qū)間、某個時間段內的數據等等。 查詢語法示例 其中, {field} 表示要查詢的字段, {lowerBound} 和 {uppe

    2024年02月03日
    瀏覽(57)
  • elasticsearch之exists查詢

    一、exists查詢簡介 elastic search提供了exists查詢,用以返回字段存在值的記錄,默認情況下只有字段的值為null或者[]的時候,elasticsearch才會認為字段不存在; exists查詢的形式如下,其中field用于指定要查詢的字段名字; 二、測試數據準備 我們盡量模擬document中字段可能出現的

    2024年02月02日
    瀏覽(21)
  • ElasticSearch序列 - SpringBoot整合ES:范圍查詢 range

    01. ElasticSearch range查詢是什么? Elasticsearch 中的 range 查詢可以用于查詢某個字段在一定范圍內的文檔。 range 查詢可同時提供包含和不包含這兩種范圍表達式,可供組合的選項如下: gt : 大于(greater than) lt : 小于(less than) gte : = 大于或等于(greater than or equal to) lte : = 小于

    2024年02月09日
    瀏覽(26)
  • elasticsearch[二]-DSL查詢語法:全文檢索、精準查詢(term/range)、地理坐標查詢(矩陣、范圍)、復合查詢(相關性算法)、布爾查詢

    elasticsearch[二]-DSL查詢語法:全文檢索、精準查詢(term/range)、地理坐標查詢(矩陣、范圍)、復合查詢(相關性算法)、布爾查詢

    elasticsearch 的查詢依然是基于 JSON 風格的 DSL 來實現的。 Elasticsearch 提供了基于 JSON 的 DSL(Domain Specific Language)來定義查詢。常見的查詢類型包括: 查詢所有 :查詢出所有數據,一般測試用。例如:match_all 全文檢索(full text)查詢 :利用分詞器對用戶輸入內容分詞,然后去

    2024年01月18日
    瀏覽(21)
  • ElasticSearch系列 - SpringBoot整合ES:查詢字段不為空的文檔 exists

    1. ElasticSearch exists 查詢是什么 在某些場景下,我們希望找到某個字段不為空的文檔,則可以用exists搜索。字段不為空的條件有: 值存在且不是 null; 值不是空數組; 值是數組,但不是 [null] 例如,查詢在字段中至少有一個非空值的文檔: 這些文檔都將匹配上面的查詢: ①

    2024年02月06日
    瀏覽(22)
  • Elasticsearch的全文搜索與匹配

    Elasticsearch是一個開源的搜索和分析引擎,基于Lucene庫,用于實現全文搜索和實時分析。它具有高性能、高可擴展性和高可用性,適用于大規(guī)模數據的搜索和分析。Elasticsearch的核心功能包括文檔存儲、搜索引擎、分析引擎和數據可視化。 Elasticsearch的全文搜索功能是其最重要的

    2024年02月22日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包