草庐IT

ElasticSearch查询常见DSL语句汇总

JobsTribe 2023-04-04 原文

ES查询之常见查询

term查询

term的查询代表完全匹配,搜索之前不会对搜索的关键词进行分词。对关键字去文档分词库中匹配内容。

基本语法

# term查询
POST scs*/_search
{
  "from": 0,
  "size":5,
  "query": {
    "term": {
      "type": {
        "value": "1"
      }
    }
  }
}

terms查询

terms和term的查询机制是一样的,都不会对搜索的关键词进行分词。对关键字去文档分词库中匹配内容。

POST scs*/_search
{
  "query": {
    "terms": {
      "customerCode.keyword": [
        "ds",
        "fc"
      ]
    }
  }
}

match 查询

match 查询属于高层查询,他会根据你查询的字段类型不一样,采用不同的查询方式。 ·查询的是日期或者是数值的话,他会将你基于的字符串查询内容转换为日期或者数值对待。 ·如果查询的内容是一个不能被分词的内容((keyword ),matchi 查询不会对你指定的查询关键字进行分词。 ·如果查询的内容时一个可以被分词的内容(text),match 会将你指定的查询内容根据一定的方式去分词,去分词库中匹配指定的内容。 matchi 查询,实际底层就是多个term查询,将多个term查询的结果给你封装到了一起。

语法

POST /sms-log-index/sms-log-type/_search
{
    "query":{
        "match":{
            "smsContent":"微信"
        }
    }
}

match_all

查询全部内容,不指定任何查询条件。

语法

POST /sms-log-index/sms-log-type/_search
{
    "query":{
        "match_all":{}
    }
}

布尔match查询

{
    "query": {
        "match": {
            "smsContent": {
                    "query": "中国 健康",
                    "operator": "and"
            }
        }
    }
}

multi-match

match针对一个field做检索,multi-match针对多个field进行检索。

POST scs*/_search
{
  "query": {
   "multi_match": {
     "query": "D",
     "fields": ["stationCode","customerCode.keyword"]
   }
  }
}

ES查询之其他查询

id

  GET scs1/_doc/1005558649YT5749518232238

ids

查询语句

POST scs*/_search
  {
    "query": {
      "ids": {
        "values": ["57111859YT5568068260191","1005558649YT5749518232238"]
      }
    }
  }

prefix

前缀查询

POST scs*/_search
{
  "query": {
    "prefix": {
      "city": {
        "value": "昆山"
      }
    }
  }
}

fuzzy

模糊查询,根据输入的字符大概取匹配结果

POST scs*/_search
{
  "query": {
    "fuzzy": {
      "city": {
        "value": "昆山",
        "prefix_length":2  ## 指定前面结果字符是不允许出现错误的
      }
    }
  }
}

wildcard

通配查询,和mysql的like查询一样,可以在字符串中指定通配符*和占位符?

POST scs*/_search
{
  "query": {
    "wildcard": {
      "city": {
        "value": "昆山*"
      }
    }
  }
}

range

范围查找,gt:大于,lt:小于 e:等于。gte:>= lte:<=

POST scs*/_search
  {
    "query": {
     "range": {
       "fee": {
         "gte": 1,
         "lte": 5
       }
     }
    }
  }

regexp

正则查询,通过你编写的正则表达式去匹配内容。
PS:
prefix、fuzzy、wildcard和regexp查询效率相对比较低,要求要求高时,避免使用。

POST scs*/_search
{
    "query": {
     "regexp": {
       "mobile":"180[0-9]{8}"
     }
    }
}

ES查询之复合查询

bool

复合过滤器,将多个查询条件,以一定的逻辑组合在一起。

  • must:所有的条件,用must组合在一起,表示and的意思。
  • must_not:将must_not中的条件,全部都不能匹配,表示not的意思。
  • should:所有的条件,用should组合在一起,表示or的意思。
POST scs*/_search
{
  "query": {
    "bool": {
      "must": [
       {
         "match": {
           "code": "00001"
         }
       }
      ],
      "must_not": [
        {"term": {
          "deviceType": {
            "value": "ZT"
          }
        }}
      ],
      "should": [
        {"term": {
          "customerCode.keyword": {
            "value": "fc"
          }
        }},
         {"term": {
          "customerCode.keyword": {
            "value": "cn"
          }
        }}
      ]
    }
  }
}

boosting

查询可以帮助取影响查询后的score。

  • positive:只有匹配上positive的查询的内容,才会被放到返回的结果集中。
  • negative:如果匹配上和positive并且也匹配上了negative,就可以降低文档的score。
  • negative_boost:指定系数,必须小于1.0。
    关于查询时,分数是如何计算的:
  • 搜索的关键字在文档中出现的频次越高,分数就越高。
  • 指定的文档内容越短,分数就越高。
  • 在搜索时,指定的关键字也会被分词。这个被分词的内容,被分词库匹配的个数越多,分数越高。
POST scs*/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match": {
          "customerCode.keyword": "DSD"
        }
      },
      "negative": {
        "match": {
          "stationCode": "A000002498"
        }
      },
      "negative_boost": 0.8
    }
  }
}

ES查询之filter查询

filter查询比较

query:根据查询条件计算文档的匹配度得到一个分数,并且根据分数进行排序,不会做缓存的
filter:根据查询条件查询文档,不计算分数,且filter会对经常被过滤的数据进行缓存。
filter查询语句

POST scs*/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "customerCode.keyword": "cn"
          }
        },
        {
          "range": {
            "opIncomeTime": {
              "gte": 1635632000000,
              "lte": 1648051199999
            }
          }
        }
      ]
    }
  }
}

ES查询之高亮查询

高亮查询是用户输入的关键字,以一定的特殊样式展示给用户。
高亮展现的数据,本身就是文档中的一个field,单独将field以highlight的样式返回给你。
es提供了一个highlight的属性,和query同级别的:
fragment_size:指定高亮数据展示多少字符回来。
pre_tags:指定前缀标签。
post_tags:指定后缀标签。

POST scs*/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "customerCode.keyword": "ds"
          }
        },
        {
          "range": {
            "opIncomeTime": {
              "gte": 1635632000000,
              "lte": 1648051199999
            }
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "customerCode":{}
    },
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fragment_size": 10
  }
}

ES查询之聚合查询

ES聚合查询和MySQL的聚合查询类型,ES的聚合查询相比MySQL要强大的多,ES提供的统计数据的方式多种多样。

POST /index/type/_search
{
    "aggs":{
        "名字":{
            "agg_type":{
                "属性":"值"
            }
        }
    }
}

去重计数查询

去重计数,即cardinality,第一步先将返回的文档中的一个指定的field进行去重,统计一共有多少条。

POST scs*/_search
{
  "aggs": {
    "agg": {
      "cardinality": {
        "field": "customerCode"
      }
    }
  }
}

range

范围统计:统计一定范围出现的文档个数,比如针对某个field的值在0,-100,100-200之间分别是多少。
范围统计可以针对普通的数值、时间类型和ip类型等做出相应的统计。

普通的数值的排序

POST scs*/_search
{
  "aggs": {
    "agg": {
      "range": {
        "field": "fee",
        "ranges": [
          {
            "to": 5
          },
          {
            "from": 5,
            "to": 10
          }
        ]
      }
    }
  }
}

日期格式排序

POST scs*/_search
{
  "aggs": {
    "agg": {
      "date_range": {
        "field": "createTime",
        "format": "yyyy", 
        "ranges": [
          {
            "to": 2021
          },
          {
            "from": 2021
          }
        ]
      }
    }
  }
}

ip地址排序

POST scs*/_search
{
  "aggs": {
    "agg": {
      "ip_range": {
        "field": "ipAddr",
        "ranges": [
          {
            "to": "10.7.1.10"
          },
          {
            "from": "10.7.1.10"
          }
        ]
      }
    }
  }
}

统计聚合查询

查询指定field的最大值、最小值、平均值和平方和。
语法:

POST scs*/_search
{
  "aggs": {
    "agg":{
      "extended_stats": {
        "field": "stationCode"
      }
    }
  }
}

ES查询之地图经纬度查询

创建索引

{
    "settings": {
            "number_of_replicas": 3,
            "number_of_shards": 5
    },
    "mappings": {
            "properties": {
                    "name": {
                            "type": "text"
                    },
                    "location": {
                            "type": "geo_point"
                    }
            }
    }
}

添加数据

PUT /map/_doc/1
{
  "name":"天安门",
  "location":
  {
    "lon":116.403981,
    "lat":39.914492
  }
}

PUT /map/_doc/2
{
  "name":"海淀公园",
  "location":
  {
    "lon":116.302509,
    "lat":39.991152
  }
}

PUT /map/_doc/3
{
  "name":"北京动物园",
  "location":
  {
    "lon":116.343184,
    "lat":39.947468
  }
}

geo_distance

geo_distance:直线距离检索,如给定点A,要求返回地图上距离点A三千米的商家(点外卖场景)
查找索引内距离3000米内的点
geo_distance涉及的参数如下

location:确定一个点;
distance:确定一个半径,单位米
distance_type:确定一个图形的类型,一般是圆形,arc

POST /map/_search
{
  "query": {
    "geo_distance":
    {
      "location":
      {
        "lon":116.433733
        ,"lat":39.908404
      },
      "distance":3000,
      "distance_type":"arc"
    }

  }
}

geo_bounding_box

geo_bounding_box:以两个点确定一个矩形,获取在矩形内的全部数据

geo_bounding_box涉及的参数如下
top_left: 左上角的矩形起始点经纬度;
bottom_right: 右下角的矩形结束点经纬度

POST /map/_search
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": {
          "lon": 116.326943,
          "lat": 39.95499
        },
        "bottom_right": {
          "lon": 116.433446,
          "lat": 39.908737
        }
      }
    }
  }
}

geo_polygon

geo_polygon涉及的参数如下
points:是个数组,存储多变形定点的经纬度,每个点用大括号包起来。

POST /map/_search
{
  "query": {
    "geo_polygon": {
      "location": {
        "points": [
          {
            "lon": 116.29561,
            "lat": 39.976004
          },
          {
            "lon": 116.364528,
            "lat": 39.996348
          },
          {
            "lon": 116.300209,
            "lat": 40.003423
          }
        ]
      }
    }
  }
}

有关ElasticSearch查询常见DSL语句汇总的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. ruby - 如何在 Ruby 中向现有方法定义添加语句 - 2

    我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca

  4. ruby - 如何在 Ruby 中创建无类 DSL? - 2

    我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中

  5. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. ruby - ruby 乘法语句中星号中断语法前的空格 - 2

    在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl

  8. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  9. ruby - 将对象设置为 nil 是否很常见? - 2

    我正在构建一个应用程序,想知道是否将未使用的对象设置为nil是生产级编码中的常见做法。我知道这只是垃圾收集器的提示,并不总是处理对象。 最佳答案 根据这个thread如果您使用完一个成员对象,将其设置为nil将引发被引用对象被垃圾回收。如果它是局部变量,方法exit将做同样的事情。也就是说,如果您要求将成员显式设置为nil,我会质疑您的设计。 关于ruby-将对象设置为nil是否很常见?,我们在StackOverflow上找到一个类似的问题: https://

  10. ruby - 在 Ruby 的 if 语句中检查 bash 命令 - 2

    如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最

随机推荐