上一篇文章讲的是ES的增删改查,本篇我们一起来学习高级一点的查询语法。
首先预览一下ES的几种查询方式:
restful API格式:http://localhost:9200/索引/_search
请求格式:POST
关键词:match
以上篇文章中book索引为例,模糊匹配title字段:
{
"query":{
"match":{
"title":"ElasticSearch入门"
}
}
}
匹配结果:
从结果中可以看出ES的模糊匹配是分词模糊匹配,我们输入“ElasticSearch入门”,只要含有“入门”和“ElasticSearch”的数据全都匹配出来了。那如果我们想要实现mysql的那种模糊匹配怎么做呢?我们可以用其余匹配。
restful API格式:http://localhost:9200/索引/_search
请求格式:POST
关键词:match_phrase
{
"query":{
"match_phrase":{
"title":"ElasticSearch入门"
}
}
}
匹配结果:
此时便做到了mysql中的模糊匹配。
restful API格式:http://localhost:9200/索引/_search
请求格式:POST
关键词:multi_match
{
"query":{
"multi_match":{
"query":"王宝宝",
"fields":["author","title"]
}
}
}
匹配结果:
title和author只要是包含“王宝宝”的数据都查询出来。
restful API格式:http://localhost:9200/索引/_search
请求格式:POST
关键词:query_string
{
"query":{
"query_string":{
"query":"(ElasticSearch and python) or 王宝宝"
}
}
}
所有字段只要包含 ElasticSerach python 王宝宝数据的都查询出来。
restful API格式:http://localhost:9200/索引/_search
请求格式:POST
关键词:term
{
"query":{
"term":{
"word_count":4000
}
}
}
查询结果为word_count=4000的数据。
restful API格式:http://localhost:9200/索引/_search
请求格式:POST
关键词:range
{
"query":{
"range":{
"word_count":{
"gte":1000,
"lte":2000
}
}
}
}
结果为查询1000到2000字数的书籍,gte:大于等于 gt:大于 lte:小于等于 lt:小于。
restful API格式:http://localhost:9200/索引/_search
请求格式:POST
关键词:bool、filter
Filter和上面的几种Query查询的区别:
1、Filter匹配结果只有Yes 或 No。Query除了查询数据外,还会对数据结果进行分数评估,计算命中率。
2、Filter顾名思义就是过滤数据,同时还会对数据做缓存,所以比Query速度要快一些。
{
"query":{
"bool":{
"filter":{
"term":{
"word_count":1000
}
}
}
}
}
restful API格式:http://localhost:9200/索引/_search
请求格式:POST
关键词:constant_score、boost
ES的查询结果中会有_score的分数,通过固定分数查询,可以筛选指定的分数。
{
"query":{
"constant_score":{
"filter":{
"match":{
"title":"ElasticSearch"
}
},
"boost":2
}
}
}
restful API格式:http://localhost:9200/索引/_search
请求格式:POST
关键词:bool、should
匹配所有author=王宝宝 或者 title=ElasticSearch的数据
{
"query":{
"bool":{
"should":[
{
"match":{
"author":"王宝宝"
}
},{
"match":{
"title":"ElasticSearch"
}
}
]
}
}
}
匹配所有author=王宝宝 并且 title=ElasticSearch的数据:
关键词:must
{
"query":{
"bool":{
"must":[
{
"match":{
"author":"王宝宝"
}
},{
"match":{
"title":"ElasticSearch"
}
}
]
}
}
}
匹配author != 王宝宝的数据:
关键词:must_not
{
"query":{
"bool":{
"must_not":[
{
"match":{
"author":"王宝宝"
}
}
]
}
}
}