搜索和查询2.0
一、ES查询上下文结果
took:当前请求消耗多少时间
time_out:当前请求是否超时
shards:分片
total:一共几个
successful:成功了几个
skipped:跳过几个
failed:失败几个
hits:真正返回给我们的结果
total
value:返回几条结果
relation:查询关系
max_score:最大评分
hits:返回结果
_index:属于哪个索引
_type:属于哪个类型
_id:id
_score:相关度评分
_source:元数据
二、相关度评分
_score:相关度评分越高,结果中数据越靠前
三、元数据
_source:source中的结果就是元数据
1、可以禁用source:节省内存开销,禁用source后之前source中展现的属性将不再展示,提高查询效率
如果只是为了节约磁盘,可以压缩索引比禁用_source更好
1 GET /product/_search 2 { 3 "_source": false, 4 "query": { 5 "match_all": {} 6 } 7 }
这里的禁用只是起到一个查询过滤的作用,没有起到真正的禁用,真正的禁用需要在创建mapping时处理
2、从mappings角度限制查询结果
但是从mappings角度进行限制不灵活,mappings创建后不能修改
3、从查询角度限制
四、Query String
1、带参数查询
GET /product/_search?q=name:xiaomi
2、分页查询
GET /product/_search?from=0&size=2&sort=price:asc
五、全文检索
1、match:按条件搜索
1 GET product/_search 2 { 3 "query": { 4 "match": { 5 "name": "xiaomi" 6 } 7 } 8 }
2、match_all:全部搜索
1 GET product/_search 2 { 3 "query": { 4 "match_all": {} 5 } 6 }
3、multi_match:name或者desc中只要包含query分词后的任意一个即可
name中包含phone或者huangmenji任意一个即可查出
desc中包含phone或者huangmenji任意一个即可查出
1 GET product/_search 2 { 3 "query": { 4 "multi_match": { 5 "query": "phone huangmenji", 6 "fields": ["name","desc"] 7 } 8 } 9 }
4、match_phrase:搜索结果中必须包含match_phrase中所有词项,必须连续且顺序必须相同
搜索结果中xiaomi nfc中不能有其他词项且xiaomi nfc顺序不能发生变化
1 GET product/_search 2 { 3 "query":{ 4 "match_phrase": { 5 "name": "xiaomi nfc" 6 } 7 } 8 }
注意:match和match_phrase会被分词
六、精准查询
1、term:不会被分词
1 GET product/_search 2 { 3 "query": { 4 "term": { 5 "name": { 6 "value": "xiaomi phone" 7 } 8 } 9 } 10 }
注意:上面这个term查询不会搜索到结果,因为term查询不会分词,所以查询条件为xiaomi phone,但是词项字典是根据name分词的,没有xiaomi phone这个词项
2、term、match、match_phrase查询的区别
term查询不会被分词,要注意词项字典中是否包含查询条件
match查询会被分词,查询结果中只需要包含match中的任意一个条件即可被查询出来
match_phrase查询会被分词,查询结果必须包含全部词项,条件顺序不能变化且词项中间不能出现其他词项
注意:以上三者与keyword的区别
以上三者为查询条件,keyword为数据类型,keyword表示该数据不会被分词,拆分成多个词项放到此项字典中
1 GET product/_search 2 { 3 "query": { 4 "term": { 5 "name.keyword": { 6 "value": "xiaomi phone" 7 } 8 } 9 } 10 }
类比上面term查询案例,此时可以查到结果,因为name这个字段不会被分词,词项字典中的词为name本身
3、terms:terms查询类似sql语句中的in
1 GET product/_search 2 { 3 "query": { 4 "terms": { 5 "tags": [ 6 "lowbee", 7 "gongjiaoka" 8 ] 9 } 10 } 11 }
4、range查找
1 GET product/_search 2 { 3 "query": { 4 "range": { 5 "price": { 6 "gte": 399, 7 "lte": 2999 8 } 9 } 10 } 11 }
七、过滤器
filter:主要为了筛选数据
1 GET product/_search 2 { 3 "query": { 4 "bool": { 5 "filter": [ 6 { 7 "term": { 8 "name": "phone" 9 } 10 } 11 ] 12 } 13 } 14 }
八、组合查询
1、must:会计算相关度分数
1 GET product/_search 2 { 3 "query": { 4 "bool": { 5 "must": [ 6 { 7 "match": { 8 "name": "xiaomi phone" 9 } 10 }, 11 { 12 "match_phrase": { 13 "desc": "shouji zhong" 14 } 15 } 16 ] 17 } 18 } 19 }
2、filter:不会计算相关度分数,max_score与_score都为0
1 GET product/_search 2 { 3 "query": { 4 "bool": { 5 "filter": [ 6 { 7 "match": { 8 "name": "xiaomi phone" 9 } 10 }, 11 { 12 "match_phrase": { 13 "desc": "shouji zhong" 14 } 15 } 16 ] 17 } 18 } 19 }
3、must_not
1 GET product/_search 2 { 3 "query": { 4 "bool": { 5 "must_not": [ 6 { 7 "match": { 8 "name": "xiaomi phone" 9 } 10 }, 11 { 12 "match_phrase": { 13 "desc": "shouji zhong" 14 } 15 } 16 ] 17 } 18 } 19 }
4、should
1 GET product/_search 2 { 3 "query": { 4 "bool": { 5 "should": [ 6 {"match_phrase": { 7 "name": "xiaomi nfc" 8 }}, 9 { 10 "range": { 11 "price": { 12 "lte": 500 13 } 14 } 15 } 16 ] 17 } 18 } 19 }
5、组合查询
1 GET product/_search 2 { 3 "query": { 4 "bool": { 5 "must": [ 6 {"match": { 7 "name": "xiaomi" 8 }} 9 ], 10 "filter": [ 11 { 12 "range": { 13 "price": { 14 "lte": 1000 15 } 16 } 17 } 18 ] 19 } 20 } 21 }
作者:http://cnblogs.com/lyc-code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。