文章目录
Dsl基础查询语句事例
1. term、terms查询
term:精确查看关键字,不使用分词器。常用于keyword,date, int等类型字段。
POST schools/classes/_search
{
"query": {
"term": {
"classes_id": 4
}
}
}
terms:精确查看某个字段里面拥有多个关键字,相当于sql中in。
POST schools/classes/_search
{
"query": {
"terms": {
"classes_id": [1,4]
}
}
}
2. match查询
match:使用分词器分割单词后在进行查询,常用于text类型字段。
POST schools/classes/_search
{
"query":{
"match": {
"name": "班级4"
}
}
}
match会将name拆分成“班级”和4,只要文档name中含有“班级”或者4就会被查出来
3. match_all查询
match_all:查询所有文档
POST schools/classes/_search
{
"query": {
"match_all": {}
}
}
4. multi_match查询
multi_match:指定多个字段
POST schools/classes/_search
{
"query": {
"multi_match": {
"query" : "班级",
"fields": ["name","address"]
}
}
}
只要name或者address中一个含有“班级”就会被查出
5. match_phrase短语匹配
match_phrase:短语匹配查询,跟match的区别是,当查询“my name”短语时,match会分割成“my” 和 “name” 只要有一个匹配就行,而match_phrase必须匹配“my name”才能被查出。
5.1 查询keyword
如果查询字段类型是keyword,那么必须完全匹配才能被查出来
例如元数据如下,address是keyword类型,name是text类型
{
"classes_id": 4,
"name": "班级4",
"address": "6-深圳市福田区福华路1",
"price": 2.4,
"timestamp": 1572577260000
}
查询
POST schools/classes/_search
{
"query": {
"match_phrase": {
"address": "6-深圳市福田区福华路1"
}
}
}
5.2 查询text
如果查询字段类型是text,那么name字段中只要包含“班级”这个短语就能被查出
POST schools/classes/_search
{
"query": {
"match_phrase": {
"name": "班级"
}
}
}
5.3 slot
对于匹配了短语"my name is"的文档,下面的条件必须为true:
- my, name和is必须全部出现在某个字段中。
- name的位置必须比my的位置大1。
- is的位置必须比my的位置大2。
slop参数: match_phrase查询词条能够相隔多远时仍然将文档视为匹配。
POST schools/classes/_search
{
"query": {
"match_phrase": {
"name": {
"query": "班级 1",
"slop": 1
}
}
}
}
slot设置成1代表 "班级 1"的短语能匹配到"班级1"的文档,哪怕相差一个位置
6. prefix前缀查询
multi_match:查询指定前缀的文档
POST schools/classes/_search
{
"query": {
"prefix": {
"name":"班级"
}
}
}
7. fuzzy模糊查询
multi_match:自动将拼写错误的搜索文本进行纠正
参数
- fuzziness:搜索文本最多可以纠正几个字母去跟你的数据进行匹配,默认如果不设置,为2
- min_similarity:设置匹配的最小相似度,默认值0.5,对于字符串,取值0-1(包括0和1);对于数值,取值可能大于1;对于日期取值为1d,1m等,1d等于1天
POST schools/classes/_search
{
"query": {
"fuzzy": {
"address": {
"value": "-深圳市福田区福华路",
"fuzziness": 2
}
}
}
}
8. 通配符查询
wildcard:支持* 或者 ?等通配符 ,* 代表多个字符,?代表一个字符
POST schools/classes/_search
{
"query": {
"wildcard": {
"address": "6-深圳市福田区*"
}
}
}
9. 正则表达式查询
regexp:查询允许您使用正则表达式进行项查询
POST schools/classes/_search
{
"query": {
"regexp":{
"name":{
"value":"班.*"
}
}
}
}
10. query_string查询( 支持lucene的查询语法 )
query_string:支持lucene的查询语法
参数:
- query: 需要查询的具体内容
- default_field: 查询的字段
- default_operator:默认运算符
- analyzer:分析器
- minimum_should_match: 最小匹配词条
POST schools/classes/_search
{
"query": {
"query_string": {
"query":"(班级 AND 6) OR 1",
"default_field":"name"
}
}
}
返回name中包含 “班级”和“6” 或者“1”的文档
11. range查询
range:范围查询
POST schools/classes/_search
{
"query": {
"range": {
"price": {
"gte": 10,
"lte": 20
}
}
}
}
12. _source, sort
_source:指定返回字段
sort::排序
{
"_source":["name"],
"query": {
"match_all": {}
},
"sort": [
{
"timestamp": {
"order": "desc"
}
}
]
}
12. cardinality
去重查询,类似于sql的distinct
如下事例返回name唯一的个数,类似于SELECT COUNT(DISTINCT name) FROM users
POST twitter/tweet/_search
{
"size" : 0,
"aggs" : {
"distinct_name" : {
"cardinality" : {
"field" : "name"
}
}
}
}
13. constant_score
在 Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序。
如果我们不关心相关性评分,可以使用constant_score 包装filter和query,并返回每个匹配的文档,其相关性得分等于boost参数值。
POST twitter/tweet/_search
{
"query": {
"constant_score" : {
"filter" : {
"term" : { "name" : "SIMA"}
},
"boost" : 1.2
}
}
}
效果
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1.2,
"hits": [
{
"_index": "twitter",
"_type": "tweet",
"_id": "3",
"_score": 1.2,
"_source": {
"name": "SIMA",
"message": "1asda爱上大声大声大声道1",
"postDate": 1574874999000,
"title": "黑龙江省北安市"
}
}
]
}
}
13. script query
通过脚本查询,语法跟版本有关
POST twitter/tweet/_search
{
"query": {
"bool": {
"must": [
{
"script": {
"script": "doc['price'].value > 1"
}
}
]
}
}
}
项目推荐
IT-CLOUD :IT服务管理平台,集成基础服务,中间件服务,监控告警服务等。
IT-CLOUD-ACTIVITI6 :Activiti教程源码。博文在本CSDN Activiti系列中。
IT-CLOUD-ELASTICSEARCH :elasticsearch教程源码。博文在本CSDN elasticsearch系列中。开源项目,持续更新中,喜欢请 Star~