{#请求消耗的时间 ms"took" : 722,#是否超时"timed_out" : false,#当前请求的分片"_shards" : {#分片的总数"total" : 1,#成功的个数"successful" : 1,#跳过的个数"skipped" : 0,#失败的个数"failed" : 0},#真正返回的结果"hits" : {#结果的总数"total" : {#查询到的结果个数,不是返回显示的个数"value" : 2,#查询关系"relation" : "eq"},#当前最大的评分"max_score" : 1.0,#具体的结果"hits" : [{#索引"_index" : "product",#类型"_type" : "_doc",#id"_id" : "1",#相关度评分"_score" : 1.0,#具体的结果详情,元数据"_source" : {"name" : "xiami phone","desc" : "shouji zhong de jianjiji","price" : 4999,"tags" : ["xingjiabi","fashao","buka"]}},{"_index" : "product","_type" : "_doc","_id" : "2","_score" : 1.0,"_source" : {"name" : "xiami nfc phone","desc" : "zhichi quangongneng nfc,shouji zhong de jianjiji","price" : 49995,"tags" : ["xingjiabi","fashao","gongjiaoka"]}}]}}
(1)设置:默认没有timeout,如果设置了timeout,那么会执行timeout机制。
(2)Timeout机制:假设用户查询结果有1W条数据,但是需要10″才能查询完毕,但是用户设置了1″的timeout,那么不管当前一共查询到了多少数据,都会在1″后ES讲停止查询,并返回当前数据。
(3)用法:GET /_search?timeout=1s/ms/m
GET /product/_search{"query":{"match_all": {}}}
GET /product/_search{"query": {"match": {"name": "nfc"}}}
GET /product/_search{"query": {"multi_match": {"query": "nfc","fields": ["name","desc"]}},"sort": [{"price": "desc"}]}
GET /product/_search{"query": {"multi_match": {"query": "nfc","fields": ["name","desc"]}},"sort": [{"price": "desc"}]}
GET /product/_search{"query":{"match": {"name": "nfc"}},"_source": ["name","price"]}
GET /product/_search{"query":{"match_all": {}},"sort": [{"price": "asc"}], "from": 0,"size": 2}
GET /product/_search{"query": {"term": {"name": "nfc"}}}
GET /product/_search{"query": {"term": {"name": "nfc phone" 这里因为没有分词,所以查询没有结果}}}GET /product/_search{"query": {"bool": {"must": [{"term":{"name":"nfc"}},{"term":{"name":"phone"}}]}}}GET /product/_search{"query": {"terms": {"name":["nfc","phone"]}}}GET /product/_search{"query": {"match": {"name": "nfc phone" }}}
GET /product/_search{"query": {"match": {"name": "xiaomi nfc zhineng phone"}}}
验证分词
GET /_analyze{"analyzer": "standard","text":"xiaomi nfc zhineng phone"}
GET /product/_search{"query": {"match_phrase": {"name": "nfc phone"}}}
1)demo案例#首先筛选name包含“xiaomi phone”并且价格大于1999的数据(不排序),#然后搜索name包含“xiaomi”and desc 包含“shouji”GET /product/_search{"query": {"bool":{"must": [{"match": { "name": "xiaomi"}},{"match": {"desc": "shouji"}}],"filter": [{"match_phrase":{"name":"xiaomi phone"}},{"range": {"price": {"gt": 1999}}}]}}}
2)bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,价钱要大于等于4999GET /product/_search{"query": {"bool":{#name中必须不能包含“erji”"must": [{"match": { "name": "xiaomi"}}],#name中必须包含“xiaomi”"must_not": [{"match": { "name": "erji"}}],#should中至少满足0个条件,参见下面的minimum_should_match的解释"should": [{"match": {"desc": "nfc"}}], #筛选价格大于4999的doc"filter": [ {"range": {"price": {"gt": 4999 }}}]}}}
GET /product/_search{"query": {"bool":{"must": [{"match": { "name": "nfc"}}],"should": [{"range": {"price": {"gt":1999}}},{"range": {"price": {"gt":3999}}}],"minimum_should_match": 1}}}
2)案例:GET /product/_search{"query": {"bool": {"filter": {"bool": {"should": [{ "range": {"price": {"gt": 1999}}},{ "range": {"price": {"gt": 3999}}}],"must": [{ "match": {"name": "nfc"}}]}}}}}
①想要一台带NFC功能的 或者 小米的手机 但是不要耳机SELECT * from product where (`name` like "%xiaomi%" or `name` like '%nfc%')AND `name` not LIKE '%erji%'GET /product/_search{"query": {"constant_score":{"filter": {"bool": {"should":[{"term":{"name":"xiaomi"}},{"term":{"name":"nfc"}}],"must_not":[{"term":{"name":"erji"}}]}},"boost": 1.2}}}
②搜索一台xiaomi nfc phone或者一台满足 是一台手机 并且 价格小于等于2999SELECT * FROM product WHERE NAME LIKE '%xiaomi nfc phone%' OR (NAME LIKE '%erji%' AND price > 399 AND price <=999);GET /product/_search{"query": {"constant_score": {"filter": { "bool":{"should":[{"match_phrase":{"name":"xiaomi nfc phone"}},{"bool":{"must":[{"term":{"name":"phone"}},{"range":{"price":{"lte":"2999"}}}]}}]}}}}}
GET /product/_search{"query" : {"match_phrase" : {"name" : "nfc phone"}},"highlight":{"fields":{"name":{}}}}
(1)解释:当你的数据超过1W,不要使用
(2)返回结果不要超过1000个,500以下为宜
(3)解决办法:
①尽量避免深度分页查询
②使用Scroll search(只能下一页,没办法上一页,不适合实时查询)
(1)解决 deep paging问题
上一篇:Java面试知识点