DSL查询是Elasticsearch 提供的一个完整的基于 JSON 的查询。其分为两大类:
GET /<target>/_search
GET /_search
POST /<target>/_search
POST /_search
target:索引名称,可以为 * 或者多个用逗号隔开的索引名称
{
"_source":{
"excludes":["remark"]
},
"query": {
"exists": {
"field":"aaa"
}
}
}
field 表示要查询的字段
{
"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": [// 命中的结果列表
]
}
}
{
"_source":{
"excludes":["remark"]
},
"query": {
"fuzzy": {
"name": {
"value": "钱军",
"fuzziness": 1,
"max_expansions": 50,
"prefix_length": 0,
"transpositions": true,
"rewrite": "constant_score"
}
}
}
}
此查询将会把name中包含“钱”和“军”的都查询出来。
编辑距离是将一个术语变成另一个术语所需的一个字符更改的数量。这些变化可以包括:
{
"_source":{
"excludes":["remark"]
},
"query": {
"ids": {
"values": ["507","699","567"]
}
}
}
此示例查询索引 _id 为 “507”,“699”,“567” 的文档数据。
{
"_source":{
"excludes":["remark"]
},
"query": {
"prefix": {
"name": {
"value":"周"
}
}
}
}
此示例查询name字段,以“周”开头的文档。
{
"_source":{
"excludes":["remark"]
},
"query": {
"range": {
"age": {
"gte":23,
"lte":24
}
}
}
}
此示例为查询age在[23,24]之间的文档。
格式 | 说明 |
---|---|
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"
}
}
}
}
表达式 | 说明 | 示例 |
---|---|---|
. | 匹配任何字符 | 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": ".+军"
}
}
}
}
示例查询以“军”字结尾的姓名
{
"_source":{
"excludes":["remark"]
},
"query": {
"term": {
"name": {
"value": "钱军"
}
}
}
}
注:term 查询主要用于精确查询,不会经过文本分析(分析器分析),所以我们应该尽量避免使用term查询text类型的字段。
{
"_source":{
"excludes":["remark"]
},
"query": {
"terms": {
"name": ["钱军","钱艳"]
}
}
}
示例匹配name值为“钱军”和“钱艳”的文档
{
"_source":{
"excludes":["remark"]
},
"query": {
"wildcard": {
"name": {
"value" : "钱*"
}
}
}
}