天天看點

分布式系列教程(33) -ElasticSearch DSL語言查詢與過濾

ES中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。由于DSL查詢更為直覺也更為簡易,是以大都使用這種方式。

DSL查詢是POST過去一個JSON,由于POST的請求是JSON格式的,是以存在很多靈活性,也有很多形式。

下面來舉些例子:

1. 根據名稱精準查詢姓名

GET user_dao/user/_search
{
  "query": {
    "term": {
      "name": "father"
    }
    
  }
}
      

傳回内容:

分布式系列教程(33) -ElasticSearch DSL語言查詢與過濾

注意:term是代表完全比對,即不進行分詞器分析,文檔中必須包含整個搜尋的詞彙。

2. 根據名稱模糊查詢姓名

GET /user_dao/user_table/_search
{
  "from": 0,
  "size": 3, 
  "query": {
    "match": {
        "name": "grand"
      }
  }
}
      

傳回結果:

  • name為grand的所有文檔。

注意:

  • 「Match」相當于模糊比對,隻包含其中一部分關鍵詞就行。
  • 「Match」會根據該字段的分詞器,進行分詞查詢,而「Term」查詢不會對字段進行分詞查詢,會采用精确比對。
GET /user_dao/user_table/_search
{
	"query": {
		"bool": {
			"must": [{
				"match_all": {}
			}],
			"filter": {
				"range": {
					"age": {
						"gt": 20,
						"lte": 60
					}
				}

			}

		}

	},
	"from": 0,
	"size": 10,
	"_source": ["name", "age"]

}
      
{
  "took": 17,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 1,
    "hits": [
      {
        "_index": "user_dao",
        "_type": "user_table",
        "_id": "5",
        "_score": 1,
        "_source": {
          "name": "grandmother",
          "age": 58
        }
      },
      {
        "_index": "user_dao",
        "_type": "user_table",
        "_id": "2",
        "_score": 1,
        "_source": {
          "name": "father",
          "age": 26
        }
      },
      {
        "_index": "user_dao",
        "_type": "user_table",
        "_id": "4",
        "_score": 1,
        "_source": {
          "name": "grandfather",
          "age": 60
        }
      },
      {
        "_index": "user_dao",
        "_type": "user_table",
        "_id": "3",
        "_score": 1,
        "_source": {
          "name": "mother",
          "age": 24
        }
      }
    ]
  }
}
      

繼續閱讀