正文
一、搜索入门
1.无条件搜索命令
GET /index/_search
GET /message/_search
2.传参搜索命令
GET /index/_search?q=filed:value
GET /message/_search?q=id:1424966164936024065
问题扩展: + 和 - 区别(见如下举例说明)
GET /message/_search?q=+id:1424966164936024065 #查询id=1424966164936024065的数据 GET /message/_search?q=-id:1424966164936024065 #查询id!=1424966164936024065的数据
3.分页搜索命令
GET /index/_search?size=x&from=x
GET /message/_search?size=10&from=0 注:类似sql > select * from message 0,10
问题扩展:分页过深,对性能有哪些影响?
1.消耗网络带宽,搜的过深,各分片(shard)要把数据传递给协调节点(coordinating node),这个过程中有大量数据传输,消耗网络 2.消耗内存,各节点(shard)要把数据传给协调节点(coordinating node),这个传递回来的数据,被协调节点(coordinating node)保存在内存中,这样会大量消耗内存 3.消耗cpu,协调节点(coordinating node)要把传回来的数据进行排序,这个排序过程很消耗cpu 因此,出于对深度分页(deep paging)的性能考虑,能少用就尽量少用
二、DSL入门
es所独有的搜索语言(ps:有点类似sql语言),可以在请求体携带搜索条件,功能强大
1.查询全部
举个栗子
GET /message/_search { "query": { "match_all": {} } }
注:看到这里,小伙伴们就要问了,es的get请求为什么可以携带请求体?这是因为es对此做出处理,至于是怎么处理的,感兴趣的小伙伴,可以去查阅资料
2.数据排序
举个栗子
GET /message/_search { "query": { "match": { "desc": "群聊" } }, "sort": [ { "createDate": { "order": "desc" } } ] }
3.分页查询
举个栗子
GET /message/_search { "query": { "match_all": {} }, "from": 0, "size": 10 }
4.返回指定字段
举个栗子
GET /message/_search { "query": { "match_all": {} }, "_source": ["username","data"] }
三、Query DSL语法
1.DSL 命令
{ query_name: { argument:value ...... } } 或者 { query_name:{ field_name:{ argument:value ...... } } }
举个栗子
1. GET /message/_search 2. { 3. "query": { 4. "match": { 5. "desc": "群聊" 6. } 7. } 8. }
2.多条件组合搜索
举个栗子
GET /message/_search { "query": { "bool": { "must": [ { "match": { "username": "admin" } } ], "should": [ { "match": { "desc": "群聊" } } ], "must_not": [ { "match": { "desc": "私聊" } } ] } } }
GET /message/_search { "query": { "bool": { "must": [ { "match": { "sendId": "1363109342432645122" } } ], "should": [ { "match": { "username": "admin" } }, { "bool": { "must": [ { "match": { "data": "无名,天地之始,有名,万物之母。" } } ] } } ] } } }
3.dsl语法
match_all - 举个栗子
GET /message/_search { "query": { "match_all": {} } }
match - 举个栗子
GET /message/_search { "query": { "multi_match": { "query": "生日快乐", "fields": ["data","data.pinyin"] } } }
range query - 举个栗子
GET /message/_search { "query": { "range": { "id": { "gte": 1359036315055083522, "lte": 1359036315055083522 } } } }
term query - 举个栗子
GET /message/_search { "query": { "term": { "username": { "value": "admin" } } } }
terms query -举个栗子
GET /message/_search { "query": { "terms": { "data": [ "年年", "岁岁" ] } } }
exists query(查询有默写字段值的文档) - 举个栗子
GET /message/_search { "query": { "exists": { "field": "remark" } } }
full query(返回包含与搜索词类似词的文档) - 举个栗子
生日1 > 生日
GET /message/_search { "query": { "fuzzy": { "data": { "value": "生日1" } } } }
ids query - 举个栗子
GET /message/_search { "query": { "ids": { "values": ["1426744462376591362","1426752233562071042"] } } }
prefix(前缀查询) - 举个栗子
GET /message/_search { "query": { "prefix": { "data": { "value": "生日快乐" } } } }
regexp query(正则查询) - 举个栗子
GET /message/_search { "query": { "regexp": { "data": "生日*" } } }
分词搜索 - 举个栗子
GET /message/_search { "query": { "bool": { "should": [ { "query_string": { "default_field": "data", "query": "shengri" } }, { "query_string": { "default_field": "data.pinyin", "query": "shengri" } } ] } } }