1. 子条件查询 (特点字段查询所指定值)
1.1 Query context(模糊)
查询时除判断是否满足查询条件外,还会计算一个“_score"的匹配标示值来判断目标文档和查询条件的匹配度。
分:全文本查询(针对文本类型数据)、字段级查询(针对结构化数据的属性查询)
1》模糊匹配
请求内容 {"query": {"match": {"name": "Elastic入门"}}}
模糊匹配会自动进行关键词的拆分,这里会拆分为Elastic 和 入门2个关键词
匹配出来的结果可能有: java入门、Elastic汇编等,如果需要将其作为整体进行模糊匹配则要采用“习语匹配”查询
2》习语匹配
请求内容{"query": {"match_phrase": {"introduce": "kongfu创始人"}}}
将输入条件作为整体进行模糊匹配
3》多字段匹配
请求内容{"query": {"multi_match": {"query": "kongfu创始人","fields":["country","introduce"]}}}
从2个字段中模糊匹配查找内容(非习语匹配)
4》语法查询(查全文)
请求内容{"query": {"query_string": {"query": "(kongfu AND 创始人) OR 张"}}}
从所有字段中查关键词,也可以配合 "fields" 指定查询属性范围
结构化查询(指定属性)
- term与match相比都能模糊匹配,但对于长一点的text内容,term不能匹配,?
-- 原因是es使用的默认分词器对于中文分词是切割每个汉字,不支持单词的切割,需要使用ik等中国分词器。
{"query": {"term": {"age": 20}}}
{"query": {"term": {"name": "张"}}}
范围查询(对数字、日期属性)
gt 大于
gte 大于等于
lt 小于
lte 小于等于
请求内容(数字)
{
"query": {
"range": {
"age": {
"gt": 25,
"lte": 50
}
}
}
}
请求内容(日期),当前日期可以用now
{
"query": {
"range": {
"date": {
"gt": "1985-01-01",
"lte": "now"
}
}
}
}
1.2 Filter context(精准)
查询过程中,只判断是否满足条件,只有yes或no
只适用于integer、date不适用于text,filter必须结合bool使用
filter会自动被缓存
请求内容
{
"query": {
"bool": {
"filter": {
"term": {
"age" : 20
}
}
}
}
}
2. 复合条件查询 (以一定逻辑组合子条件查询)
1. 固定分数查询
将之前匹配结果中的_score值固定下来,默认为1
请求:
{
"query": {
"constant_score": {
"filter": {
"match": {
"introduce": "掌门"
}
}
}
}
}
结果:
{
"took": 96,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "people",
"_type": "man",
"_id": "4KmSWWcBRM5zB9jDk-jR",
"_score": 1,
"_source": {
"name": "张无忌",
"country": "China",
"age": 20,
"introduce": "明教掌门,kongfu创始人",
"date": "1988-9-1"
}
},
{
"_index": "people",
"_type": "man",
"_id": "1",
"_score": 1,
"_source": {
"name": "张三丰",
"country": "少林",
"age": 30,
"introduce": "少林和武当山掌门,太极拳创始人",
"date": "1987-9-1"
}
}
]
}
}
也可以指定分数:
{
"query": {
"constant_score": {
"filter": {
"match": {
"introduce": "掌门"
}
},
"boost":3 //用于指定匹配结果的_score值
}
}
}
2. 布尔查询
通过bool进行的复合查询,没太搞懂!!!
should 是多个条件满足一个就可以,相当于or
must是多个条件都要满足,相当于and,试验证明满足一个也会出现???!!!!
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "张三"
}
},
{
"match": {
"introduce": "掌门"
}
}
]
}
}
}
返回结果:
{
"took": 73,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1.1507283,
"hits": [
{
"_index": "people",
"_type": "man",
"_id": "1",
"_score": 1.1507283,
"_source": {
"name": "张三丰",
"country": "少林",
"age": 30,
"introduce": "少林和武当山掌门,太极拳创始人",
"date": "1987-9-1"
}
},
{
"_index": "people",
"_type": "man",
"_id": "4KmSWWcBRM5zB9jDk-jR",
"_score": 0.8630463,
"_source": {
"name": "张无忌",
"country": "China",
"age": 20,
"introduce": "明教掌门,kongfu创始人",
"date": "1988-9-1"
}
}
]
}
}
还可以增加filter+term进行数字值过滤
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三丰"
}
},
{
"match": {
"introduce": "武当"
}
}
],
"filter": [
{
"term": {
"age": 20
}
}
]
}
}
}
可以使用must_not进行反过滤,相当于not
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name": "三丰"
}
},
{
"match": {
"introduce": "武当"
}
}
]
}
}
}
网友评论