一、term查询
代码语言:javascript复制{
"query": {
"term": {
"title": "hello"
}
}
}
1.1、指定权重
代码语言:javascript复制{
"query": {
"term": {
"title": {
"value":"hello",
"boost":10.0
}
}
}
}
1.2.多term查询查询tags字段中包含novel或book
代码语言:javascript复制{
"query": {
"terms": {
"tags": ["novel","book"]
}
}
}
二、常用词查询
2.1、cutoff_frequency查询低于这个概率的词
代码语言:javascript复制{
"query": {
"common": {
"title":{
"query":"hello and hello",
"cutoff_frequency":0.001
}
}
}
}
2.2、match查询( 不支持lucene查询语法,分词后再查询 )
查询title包含hello或and或like的文档
代码语言:javascript复制{
"query": {
"match": {
"title": "hello and like"
}
}
}
2.3、operator操作符
要求and或者or匹配文本的分词
代码语言:javascript复制{
"query": {
"match": {
"title": {
"query":"hello and like",
"operator":"and"
}
}
}
}
2.4、短语查询
代码语言:javascript复制{
"query": {
"match_phrase": {
"title": {
"query":"hello and like",
"slop":1
}
}
}
}
2.5、前缀查询
对查询关键词的最后一个词条做前缀匹配
代码语言:javascript复制{
"query": {
"match_phrase_prefix": {
"title": {
"query":"hello and like",
"slop":1,
"max_expansions":20
}
}
}
}
2.6.multi_match( 针对多个字段查询 )
代码语言:javascript复制{
"query": {
"multi_match": {
"query":"hello and like",
"fields":["title","author"]
}
}
}
三、query_string查询( 支持lucene的查询语法 )
3.1、复合语法查询
title字段包含hello,且权重为10,也要包含like,但是otitle不包含cat,同事author字段包含Fyodor和dostoevsky。
代码语言:javascript复制{
"query": {
"query_string": {
"query":"title:hello^10 title:like -otitle:cat author:( Fyodor dostoevsky)",
"default_field":"title"
}
}
}
3.2、针对多字段查询
use_dis_max使用最大分查询,max指对于给定的关键词,只有最高分才会包括在最后的文档的评分中,而不是所有包含该词条的所有字段分数之和。
代码语言:javascript复制{
"query": {
"query_string": {
"query":"hello and like",
"fields":["title","author"],
"use_dis_max":true
}
}
}
常见写法:
{“query”:{“query_string”:{“name:hello”}}}
name字段为hello
{“query”:{“query_string”:{“nam\*:hello”}}}
存在一个nam开头的字段,值为hello
{“query”:{“query_string”:{“__missing__:name”}}}
name字段值为null的文档
{“query”:{“query_string”:{“__exists__:name”}}}
name字段值不为null的文档
{“query”:{“query_string”:{“name:(hello OR like)”}}}
name字段为hello或者like的文档
3.3、simple_query_string查询
解析出错时不抛异常,丢弃查询无效的部分
代码语言:javascript复制{
"query": {
"simple_query_string": {
"query":"title:hello^10 title:like -otitle:cat author:( Fyodor dostoevsky)",
"default_operator":"or"
}
}
}
3.4、标识符查询
代码语言:javascript复制{
"query": {
"ids": {
"type":"book",
"values":["1","2","3"]
}
}
}
3.5、前缀查询
前缀匹配给定的关键词
代码语言:javascript复制{
"query": {
"prefix": {
"title":"cri"
}
}
}
指定权重
代码语言:javascript复制{
"query": {
"prefix": {
"title":{
"value":"cri",
"boost":3.0
}
}
}
}
3.6、fuzzy模糊查询
使用编辑距离的模糊查询,计算量较大,但是对用户拼写错的场景比较有用
代码语言:javascript复制{
"query": {
"fuzzy": {
"title":"hello"
}
}
}
指定最小相似度偏差
代码语言:javascript复制{
"query": {
"fuzzy": {
"title":{
"value":"hello",
"min_similarity":1
}
}
}
}
3.7、通配符查询
支持*和?等通配符
代码语言:javascript复制{
"query": {
"wildcard": {
"title": "he?lo"
}
}
}
?:任意字符
*:0个或任意多个字符
性能差,必须扫描整个倒排索引,才ok
3.8、范围查询
只能针对单个字段,可以是数值型的,也可以是基于字符串的。
代码语言:javascript复制{
"query": {
"range": {
"year": {
"gte" :1890,
"lte":1900
}
}
}
}
3.9、正则表达式查询
查询性能取决于正则表达式
代码语言:javascript复制{
"query": {
"regexp": {
"title": {
"value" :"cr.m[ae]",
"boost":10.0 //配置评分乘以10
}
}
}
}
K[A-Z].
[0-9]:指定范围内的数字
[a-z]:指定范围内的字母
.:一个字符
:前面的正则表达式可以出现一次或多次
wildcard和regexp,与prefix原理一致,都会扫描整个索引,性能很差
四、布尔查询( 组合查询 )
代码语言:javascript复制{
"query": {
"bool": {
"must": {
"term": {
"title": "hello"
}
},
"should": {
"range": {
"year": {
"from": 1900,
"to": 2000
}
}
},
"must_not": {
"term": {
"otitle": "nothing"
}
}
}
}
}
mus:必须包含的条件,must not:不包含 ,should:包含的话会更匹配
搜索多个条件:
代码语言:javascript复制GET test*/_search
{
"size":3,
"query": {
"bool":{
"must": [
{"match":{"message": "学生"}},
{"match":{"message": "所有"}}
],
"should": [
{"match": {"port": "53198"}},
{"match": {"@timestamp":"2018-09-17T17:49:25.991Z"}}
],
"must_not": [
{"match": {"port": "64273"}},
{"match": {"port":"1234"}}
]
}
}
}
结果:
代码语言:javascript复制{
"took": 25,
"timed_out": false,
"_shards": {
"total": 35,
"successful": 35,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 14,
"max_score": 17.026089,
"hits": [
{
"_index": "test-name",
"_type": "doc",
"_id": "Ff0g6GUBPXqEl7zCsbQb",
"_score": 17.026089,
"_source": {
"@timestamp": "2018-09-17T15:23:06.878Z",
"appname": "test-name",
"level": "INFO",
"port": 55714,
"thread_name": "main",
"level_value": 20000,
"appName": "test-name",
"@version": 1,
"host": "192.168.1.100",
"logger_name": "com.example.service.StudentService",
"@metdata": {
"ip_address": "192.168.1.100"
},
"message": "查询所有学生,pageNo1,pageSize1"
}
},
{
"_index": "test-name",
"_type": "doc",
"_id": "WFOm6GUBlATfpgHyvD55",
"_score": 16.024178,
"_source": {
"@timestamp": "2018-09-17T17:49:25.991Z",
"appname": "test-name",
"level": "INFO",
"port": 53198,
"thread_name": "main",
"level_value": 20000,
"appName": "test-name",
"@version": 1,
"host": "192.168.1.100",
"logger_name": "com.example.service.StudentService",
"@metdata": {
"ip_address": "192.168.1.100"
},
"message": "查询所有学生,pageNo1,pageSize1"
}
},
{
"_index": "test-name",
"_type": "doc",
"_id": "nAMg42UBRHcv2wBhnFDg",
"_score": 14.024178,
"_source": {
"@timestamp": "2018-09-16T16:04:54.948Z",
"appname": "test-name",
"level": "INFO",
"port": 58709,
"thread_name": "main",
"level_value": 20000,
"appName": "test-name",
"@version": 1,
"host": "172.20.10.6",
"logger_name": "com.example.service.StudentService",
"@metdata": {
"ip_address": "172.20.10.6"
},
"message": "查询所有学生,pageNo1,pageSize1"
}
}
]
}
}
这个是一般我们使用的api 了,不知道为啥发了很多次都发不出去。难。。。。。。