ElasticSearch的进阶语法
2025-02-23 13:44:47 0 举报
AI智能生成
ElasticSearch的进阶语法
作者其他创作
大纲/内容
match_all
GET /index_name/_search
{
"query": {
"match_all": {}
},
"_source": ["字段1","字段2"], // 类似select
"sort": [
{"排序字段": "desc或者asc"}
],
"from": P, // 从P开始查N条,可用于分页
"size": N // 不配,默认最多10
}
{
"query": {
"match_all": {}
},
"_source": ["字段1","字段2"], // 类似select
"sort": [
{"排序字段": "desc或者asc"}
],
"from": P, // 从P开始查N条,可用于分页
"size": N // 不配,默认最多10
}
精确匹配
term单字段精确匹配
类似于mysql的精确匹配int、varchar、datetime、double等,要查询keyword,非text类型的字段
如果要匹配text,会有两种情况
GET /index_name/_search
{
"query": {
"term": {
"字段名.keyword": {
"value": "xxx" // 这里的xxx是字段对应值的完整内容
}
}
}
}
{
"query": {
"term": {
"字段名.keyword": {
"value": "xxx" // 这里的xxx是字段对应值的完整内容
}
}
}
}
GET /index_name/_search
{
"query": {
"term": {
"字段名": {
"value": "xxx" // 这里的xxx是字段分词后的某个词
}
}
}
}
{
"query": {
"term": {
"字段名": {
"value": "xxx" // 这里的xxx是字段分词后的某个词
}
}
}
}
如果匹配的是一个数组,那么只要命中数组中的某一个值就可以
可以通过移除算分的方式,来提示效率,因为本身就是精确匹配,无需算分
GET /index_name/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"字段名.keyword": "xxx" // 这里的xxx是字段对应值的完整内容
}
}
}
}
}
}
{
"query": {
"constant_score": {
"filter": {
"term": {
"字段名.keyword": "xxx" // 这里的xxx是字段对应值的完整内容
}
}
}
}
}
}
terms多字段精确匹配
GET /index_name/_search
{
"query": {
"terms": {
"字段名.keyword": [
"yyy","xxx","ttt" // 这里的值是字段对应值的完整内容
]
}
}
}
{
"query": {
"terms": {
"字段名.keyword": [
"yyy","xxx","ttt" // 这里的值是字段对应值的完整内容
]
}
}
}
其他和单字段类似
range范围查询
数字型范围
GET /index_name/_search
{
"query": {
"range": {
"age": {
"gte": 1,
"lte": 10
}
}
}
}
GET /index_name/_search
{
"query": {
"range": {
"age": {
"gte": 1,
"lte": 10
}
}
}
}
日期型范围
GET /index_name/_search
{
"query": {
"range": {
"mydate": {
"gte": "yyy",
"lte": "xxx"
}
}
}
}
上面的yyy、xxx也可以用内置方法,now当前时间
GET /index_name/_search
{
"query": {
"range": {
"mydate": {
"gte": "yyy",
"lte": "xxx"
}
}
}
}
上面的yyy、xxx也可以用内置方法,now当前时间
now-2d 当前时间减2天
w:周
M:月
y:年
h:小时
m:分钟
注意有8小时时差,所以要+8
查询时最好带上/m,这样es会产生缓存,能提高查询效率
now/y精确到年,now/M精确到月,now/w精确到周,now/d精确到日,now/h精确到小时
exists
GET /index_name/_search
{
"query": {
"exists": {
"field": "字段名" // 判断字段是否存在
}
}
}
{
"query": {
"exists": {
"field": "字段名" // 判断字段是否存在
}
}
}
ids
GET /index_name/_search
{
"query": {
"ids": {
"values": [1,2,3...]
}
}
}
{
"query": {
"ids": {
"values": [1,2,3...]
}
}
}
prefix前缀匹配
不会对输入的查询条件做分词
不会做习惯性分数计算
需要遍历所有,性能略低
GET /index_name/_search
{
"query": {
"prefix": {
"字段名.keyword": {
"value": "xxx" // 这里的xxx是字段对应值的完整内容的前缀,类似like 'xxx%'
}
}
}
}
{
"query": {
"prefix": {
"字段名.keyword": {
"value": "xxx" // 这里的xxx是字段对应值的完整内容的前缀,类似like 'xxx%'
}
}
}
}
wildcard通配符匹配
*:0或多个字符
?:一个字符
尽量不使用,性能很低
GET /index_name/_search
{
"query": {
"wildcard": {
"字段名.keyword": {
"value": "这是*,哈哈*"
}
}
}
}
{
"query": {
"wildcard": {
"字段名.keyword": {
"value": "这是*,哈哈*"
}
}
}
}
fuzzy支持编辑距离的模糊查询
实现对输入的错别字进行识别
GET /index_name/_search
{
"query": {
"fuzzy": {
"字段名": {
"value": "xxx",
"fuzziness": "AUTO", // 支持0/1/2个错别字,默认0,其他值会报错
"prefix_length": 1 // 搜索词的前缀长度,默认0,长度内的字符,不会应用到模糊匹配上
}
}
}
}
{
"query": {
"fuzzy": {
"字段名": {
"value": "xxx",
"fuzziness": "AUTO", // 支持0/1/2个错别字,默认0,其他值会报错
"prefix_length": 1 // 搜索词的前缀长度,默认0,长度内的字符,不会应用到模糊匹配上
}
}
}
}
regexp正则匹配
GET /index_name/_search
{
"query": {
"regexp": {
"字段名.keyword": {
"value": "xxx.*"
}
}
}
}
{
"query": {
"regexp": {
"字段名.keyword": {
"value": "xxx.*"
}
}
}
}
term set用于解决多值字段中的文档匹配
全文检索
对输入查询条件进行分词
然后匹配keyword
适用于text
单词检索
GET /index_name/_search
{
"query": {
"match": {
"字段名": "xxx" // 这种其实是or效果
}
}
}
GET /index_name/_search
{
"query": {
"match": {
"字段名": "xxx" // 这种其实是or效果
}
}
}
单词检索,输入的值,分词后,必须匹配指定个数的分词
GET /index_name/_search
{
"query": {
"match": {
"字段名": {
"query": "xxx",
"minimum_should_match": 2 // 这里代表至少匹配2个分词
}
}
}
}
GET /index_name/_search
{
"query": {
"match": {
"字段名": {
"query": "xxx",
"minimum_should_match": 2 // 这里代表至少匹配2个分词
}
}
}
}
单词检索,输入的值,分词后,其分词结果和查询内容完全匹配,即分词数量一致,分词内容一致
GET /index_name/_search
{
"query": {
"match": {
"字段名": {
"query": "xxx",
"operator": "and" // 完全匹配
}
}
}
}
GET /index_name/_search
{
"query": {
"match": {
"字段名": {
"query": "xxx",
"operator": "and" // 完全匹配
}
}
}
}
多词检索
GET /index_name/_search
{
"query": {
"multi_match": {
"query": "xxx",
"fields": ["字段1","字段2"...]
}
}
}
GET /index_name/_search
{
"query": {
"multi_match": {
"query": "xxx",
"fields": ["字段1","字段2"...]
}
}
}
match_phrase短语匹配,要求分词匹配,顺序也匹配,但是可以通过slop来控制顺序间隔数,默认1,一般用不到,因为分词算法不可控
query_string
GET /index_name/_search
{
"query": {
"query_string": {
"default_field": ["字段1","字段2"],
"query": "分词1 OR 分词2 OR (分词3 AND 分词4)" // 也可以用AND
}
}
}
{
"query": {
"query_string": {
"default_field": ["字段1","字段2"],
"query": "分词1 OR 分词2 OR (分词3 AND 分词4)" // 也可以用AND
}
}
}
组合查询
must(需算分,有性能损耗)
GET /index_name/_search
{
"query": {
"bool": {
"must": [
{"match": {"字段名1": "xxx"}},
{"match": {"字段名2": "yyy"}}
]
}
}
}
{
"query": {
"bool": {
"must": [
{"match": {"字段名1": "xxx"}},
{"match": {"字段名2": "yyy"}}
]
}
}
}
should(需算分,有性能损耗)
GET /index_name/_search
{
"query": {
"bool": {
"should": [
{"match": {"字段名1": "xxx"}},
{"match": {"字段名2": "yyy"}}
],
"minimun_should_match": 1 // 至少需要满足一个条件
}
}
}
{
"query": {
"bool": {
"should": [
{"match": {"字段名1": "xxx"}},
{"match": {"字段名2": "yyy"}}
],
"minimun_should_match": 1 // 至少需要满足一个条件
}
}
}
filter(无需算分)
GET /index_name/_search
{
"query": {
"bool": {
"filter": [
{"term": {"字段名1": "xxx"}},
{"range": {"字段名2": {"gte": "xxx"}}}
]
}
}
}
{
"query": {
"bool": {
"filter": [
{"term": {"字段名1": "xxx"}},
{"range": {"字段名2": {"gte": "xxx"}}}
]
}
}
}
term和range本身就是精确查找,无需算分,所以不需要用must和should
must_not(无需算分)
高亮显示实现
GET /index_name/_search
{
"query": {
"term": {
"字段名": {
"value": "xxx" // 这里的xxx是字段分词后的某个词
}
}
},
"highlight": {
"post_tags": ["</span>"], // 可以自定义高亮语法
"pre_tags": ["<span style='color: red'>"],
"request_field_match": false,
"fields": {
"字段1": {}, // 也可以不指定字段,使用"*": {},匹配所有字段
"字段2": {}
}
}
}
{
"query": {
"term": {
"字段名": {
"value": "xxx" // 这里的xxx是字段分词后的某个词
}
}
},
"highlight": {
"post_tags": ["</span>"], // 可以自定义高亮语法
"pre_tags": ["<span style='color: red'>"],
"request_field_match": false,
"fields": {
"字段1": {}, // 也可以不指定字段,使用"*": {},匹配所有字段
"字段2": {}
}
}
}
地理空间位置查询
创建索引时,字段的类型type,必须是geo_point,子集是lat和lon
GET /index_name/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "10km", //距离,单位有m、km两种
"distance_type": "arc", //arc地球表面弧长,plane直线距离单位
"location": { // 查询参考点,即圆心
"lat": xxx,
"lon": yyy
}
}
}
}
}
}
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "10km", //距离,单位有m、km两种
"distance_type": "arc", //arc地球表面弧长,plane直线距离单位
"location": { // 查询参考点,即圆心
"lat": xxx,
"lon": yyy
}
}
}
}
}
}
向量检索

收藏
0 条评论
下一页