Elasticsearch 基础查询

文章目录

  • DSL(Domain Specific Language)查询
  • 查询接口
  • exists 查询字段是否存在
    • 执行结果
  • fuzzy 模糊查询
    • 编辑距离
    • 参数说明
  • 通过_id列表查询
  • prefix 前缀查询
    • 参数说明
  • range 范围查询
  • 参数说明
    • 日期计算
      • 计算格式
  • Regexp 正则表达式查询
    • 正则表达式规则
    • 查询示例
    • regexp 查询参数
  • term 精确查询
    • 查询参数
  • terms 多关键字精确匹配
    • 参数说明
  • wildcard 通配符查询
    • 参数说明

DSL(Domain Specific Language)查询

DSL查询是Elasticsearch 提供的一个完整的基于 JSON 的查询。其分为两大类:

  • 普通查询:如match、term、range等
  • 复合查询:可以以多个普通查询组合的方式进行查询。

查询接口

GET /<target>/_search

GET /_search

POST /<target>/_search

POST /_search

target:索引名称,可以为 * 或者多个用逗号隔开的索引名称

exists 查询字段是否存在

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "exists": {
      "field":"aaa"
    }
  }
}

field 表示要查询的字段

  • 如果 JSON 值为null或[],则字段被视为不存在
  • 如果是包含null值的数组[null,aaa]或空字符串""则表示该字段存在。

执行结果

{
    "took": 267, // 查询花费时间,单位毫秒
    "timed_out": false, // 是否超时
    "_shards": { // 分片信息
        "total": 3, // 分片总数
        "successful": 3, // 成功数
        "skipped": 0, // 跳过(忽略)数
        "failed": 0 // 失败数
    },
    "hits": { // 命中结果对象
        "total": { // 按条件匹配的文档数
            "value": 3, // 文档数
            "relation": "eq" //eq 表示计数准确, gte 表示计数不准确
        },
        "max_score": 1, // 匹配度分值,一般为0~1
        "hits": [// 命中的结果列表
           
        ]
    }
}

fuzzy 模糊查询

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "fuzzy": {
      "name": {
        "value": "钱军",
        "fuzziness": 1,
        "max_expansions": 50,
        "prefix_length": 0,
        "transpositions": true,
        "rewrite": "constant_score"
      }
    }
  }
}

此查询将会把name中包含“钱”和“军”的都查询出来。

编辑距离

编辑距离是将一个术语变成另一个术语所需的一个字符更改的数量。这些变化可以包括:

  • 改变一个字符(b ox → f ox)
  • 删除一个字符(b lack → lack)
  • 插入一个字符 (sic → sic k )
  • 调换两个相邻字符 ( act → cat t)

参数说明

  • :要搜索的字段,示例为 name
    • value
      (必需,字符串)您希望在提供的.
    • fuzziness
      (可选,字符串)允许匹配的最大编辑距离。
      • 0…2
        必须完全匹配
      • 3…5
        允许一次编辑
      • > 5
        允许两次编辑
      • AUTO
        首选值应该使用AUTO 等同于3,6
    • max_expansions
      (可选,整数)创建的最大变体数。默认为50。建议不要太大,否则影响效率。
    • prefix_length
      (可选,整数)创建扩展时保持不变的起始字符数。默认为0.
    • transpositions
      (可选,布尔值)指示编辑是否包括两个相邻字符的换位 (ab → ba)。默认为true.
    • rewrite
      (可选,字符串)用于重写查询的方法。rewrite参数有很多可选值,建议使用constant_score、 constant_score_boolean或top_terms_boost_N即可。默认为constant_score。

通过_id列表查询

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "ids": {
      "values": ["507","699","567"]
    }
  }
}

此示例查询索引 _id 为 “507”,“699”,“567” 的文档数据。

prefix 前缀查询

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "prefix": {
      "name": {
        "value":"周"
      }
    }
  }
}

此示例查询name字段,以“周”开头的文档。

参数说明

  • :要搜索的字段,示例为 name
    • value
      (必需,字符串)查询参数
    • rewrite
      (可选,字符串)用于重写查询的方法。
    • case_insensitive
      (可选,布尔值)设置为 true 时允许不区分大小写的值与索引字段值匹配。默认为 false,区分大小写。

range 范围查询

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "range": {
      "age": {
        "gte":23,
        "lte":24
      }
    }
  }
}

此示例为查询age在[23,24]之间的文档。

参数说明

  • :要搜索的字段,示例为 name
    • gt
      (可选)大于。
    • gte
      (可选)大于或等于。
    • lt
      (可选)小于。
    • lte
      (可选)小于或等于。
    • format
      (可选,字符串)用于转换date查询中值的日期格式。
    • relation
      (可选,字符串)指示范围查询如何匹配字段值range 。有效值为:
      • INTERSECTS(默认)
        匹配范围字段值与查询范围相交的文档。
      • CONTAINS
        匹配具有完全包含查询范围的范围字段值的文档。
      • WITHIN
        匹配范围字段值完全在查询范围内的文档。
    • time_zone
      (可选,字符串) 用于将查询中的值转换为 UTC的协调世界时 (UTC) 偏移量。有效值为 ISO 8601 UTC 偏移量,例如+01:00或 -08:00和 IANA 时区 ID,例如America/Los_Angeles。如果使用 now 则始终是 UTC 中的当前系统时间
    • boost
      (可选,float)浮点数,用于减少或增加 查询的相关性分数。默认为1.0。0和之间的提升值 1.0会降低相关性得分。大于的值1.0 会增加相关性分数。

日期计算

计算格式

  • +1h: 加一小时
  • -1d: 减去一天
  • /d:四舍五入到最近的一天
格式 说明
y
M
w
d
h 小时
H 小时
m 分钟
s

假设now是2001-01-01 12:00:00,那么

 now+1h:now以毫秒加一小时为单位。结果:2001-01-01 13:00:00
 now-1h:now以毫秒减一小时为单位。结果:2001-01-01 11:00:00
 now-1h/d:now以毫秒减一小时为单位,四舍五入。结果:2001-01-01 00:00:00
 2001.02.01\|\|+1M/d:2001-02-01以毫秒加一个月为单位。结果:2001-03-01 00:00:00
 # 2001.02.01视为字符串,后面需要跟 ||,此处使用了 \ 斜线来转义

比如:查询生日在1988.11.30日之前的文档信息

{
 "_source":{
   "excludes":["remark"]
 },
 "query": {
   "range": {
     "birthday": {
       "lte":"1988.11.30",
       "format":"yyyy.MM.dd"
     }
   }
 }
}

查询当前时间之前1个月以前出生的人的文档

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "range": {
      "birthday": {
        "lte":"now-1M"
      }
    }
  }
}

Regexp 正则表达式查询

正则表达式规则

表达式 说明 示例
. 匹配任何字符 ab. 匹配 abc,abb、abd等
? 重复一次或0次 ab? 匹配 ab,abc,abb等
+ 重复前一个表达式或字符一次或多次 ab+ 匹配 abddd,abc,abbaaa等
* 重复前一个表达式或字符0次或多次 ab* 匹配 a,ab,abc,abb等
{} 前面的字符可以重复的最小和最大次数 a{2} # 匹配 ‘aa’
a{2,4} # 匹配 ‘aa’、‘aaa’ 和 ‘aaaa’
a{2,} # 匹配 'a` 重复两次或更多次
| 或运算符 abc|xyz # 匹配 ‘abc’ 和 ‘xyz’
() 组合,将()内的字符视为一个整体 abc(def)? # 匹配 ‘abc’ 和’abcdef’ 但不匹配 ‘abcd’
[] 将[]内的字符视为一个占位字符 [abc] # 匹配 ‘a’, ‘b’, ‘c’
[a-c] # 匹配 ‘a’、‘b’ 或 ‘c’
[-abc] # ‘-’ 是第一个字符。匹配 ‘-’、‘a’、‘b’ 或 ‘c’
[abc\-] # 转义 ‘-’。匹配 ‘a’、‘b’、‘c’ 或 ‘-’
^ 非运算符,常和[]一起使用 [^abc] # 匹配除 ‘a’、‘b’ 或 ‘c’ 之外的任何字符
[^ac] # 匹配除 ‘a’、‘b’ 或 ‘c’ 之外的任何字符
[^-abc] # 匹配任何字符character except ‘-’, ‘a’, ‘b’, or ‘c’
[^abc-] # 匹配除 ‘a’, ‘b’, ‘c’, or ‘-’ 之外的任何字符

注:Lucene 的正则表达式引擎不支持锚运算符,例如 ^(行首)或$(行尾)。

查询示例

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "regexp": {
      "name": {
        "value": ".+军"
      }
    }
  }
}

示例查询以“军”字结尾的姓名

regexp 查询参数

  • :要搜索的字段,示例为 name
    • value:(必需,字符串)标准的正则表达式
    • case_insensitive:(可选,布尔值)当设置为 true 时,允许正则表达式值与索引字段值进行不区分大小写的匹配。默认为 false。
    • flags
      (可选,字符串)为正则表达式启用可选运算符,默认为 ALL。
    • rewrite
      (可选,字符串)用于重写查询的方法。

term 精确查询

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "term": {
      "name": {
        "value": "钱军"
      }
    }
  }
}

查询参数

  • :要搜索的字段,示例为 name
    • value
      (必需,字符串)查询参数内容
    • boost
      (可选,float)浮点数,用于减少或增加 查询的相关性分数。默认为1.0。小于1减少,大于1增加相关性分数。
    • case_insensitive:(可选,布尔值)当设置为 true 时,允许正则表达式值与索引字段值进行不区分大小写的匹配。默认为 false。

注:term 查询主要用于精确查询,不会经过文本分析(分析器分析),所以我们应该尽量避免使用term查询text类型的字段。

terms 多关键字精确匹配

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "terms": {
      "name": ["钱军","钱艳"]
    }
  }
}

示例匹配name值为“钱军”和“钱艳”的文档

参数说明

  • :要搜索的字段,示例为name
  • boost:(可选,float)浮点数,用于减少或增加 查询的相关性分数。默认为1.0。小于1减少,大于1增加相关性分数。

wildcard 通配符查询

{
  "_source":{
    "excludes":["remark"]
  },
  "query": {
    "wildcard": {
      "name": {
        "value" : "钱*"
      }
    }
  }
}

参数说明

  • :要搜索的字段,示例为name
    • value
      (必需,字符串)通配符表达式( 只支持两种通配符 “?”和“*” )
    • boost:(可选,float)浮点数,用于减少或增加 查询的相关性分数。默认为1.0。小于1减少,大于1增加相关性分数。
    • case_insensitive:(可选,布尔值)当设置为 true 时,允许正则表达式值与索引字段值进行不区分大小写的匹配。默认为 false。
    • rewrite
      (可选,字符串)用于重写查询的方法。

你可能感兴趣的:(elasticsearch,搜索引擎,模糊查询,正则匹配,_search,API)