ES中的查詢請求有兩種方式,一種是簡易版的查詢,另外一種是使用JSON完整的請求體,叫做結構化查詢(DSL)。由于DSL查詢更為直覺也更為簡易,是以大都使用這種方式。
DSL查詢是POST過去一個JSON,由于POST的請求是JSON格式的,是以存在很多靈活性,也有很多形式。
下面來舉些例子:
1. 根據名稱精準查詢姓名
GET user_dao/user/_search
{
"query": {
"term": {
"name": "father"
}
}
}
傳回内容:
注意: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
}
}
]
}
}