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