文章目录
- 前言
- 一、地理位置查询
-
- [1、点位距离查询:geo_distance query](#1、点位距离查询:geo_distance query)
- [2、矩形面内查询:geo_bounding_box query](#2、矩形面内查询:geo_bounding_box query)
- [3、多边形范围内查询:geo_polygon query](#3、多边形范围内查询:geo_polygon query)
- [4、集合图形关系查询:geo_shape query](#4、集合图形关系查询:geo_shape query)
- 二、特殊查询
-
- [1、内容推荐查询:more_like_this query](#1、内容推荐查询:more_like_this query)
- [2、脚本查询:script query](#2、脚本查询:script query)
- [3、percolate query](#3、percolate query)
- 总结
前言
最近除了再用es的基础全文查询
外,也频繁用到了ES的地理位置查询与特殊查询
,故而再次记录一下。
一、地理位置查询
1、点位距离查询:geo_distance query
例如:给出一个中心点,查询距离该中心点指定范围内的文档:
javascript
GET /address_point/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": [
{
"geo_distance": {
"distance": "600km",
"location": {
"lat": 34.288991,
"lon": 108.940429
}
}
}
]
}
}
}
查询以(34.288991,108.940429) 为圆心,以 600KM 为半径,这个范围内的数据。
2、矩形面内查询:geo_bounding_box query
在某一个矩形内的点,通过两个点锁定一个矩形:
javascript
GET /address_point/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": [
{
"geo_bounding_box": {
"location": {
"top_left": {
"lat": 32.0639555946604,
"lon": 118.78967285156249
},
"bottom_right": {
"lat": 29.98824461550903,
"lon": 122.20642089843749
}
}
}
}
]
}
}
}
以南京经纬度作为矩形的左上角,以舟山经纬度作为矩形的右下角,构造出来的矩形中,包含上海和杭州两个城市。
3、多边形范围内查询:geo_polygon query
在某一个多边形范围内的查询:
javascript
GET /address_point/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": [
{
"geo_polygon": {
"location": {
"points": [
{
"lat": 31.793755581217674,
"lon": 113.8238525390625
},
{
"lat": 30.007273923504556,
"lon":114.224853515625
},
{
"lat": 30.007273923504556,
"lon":114.8345947265625
}
]
}
}
}
]
}
}
}
给定多个点,由多个点组成的多边形中的数据。
4、集合图形关系查询:geo_shape query
geo_shape
用来查询图形,针对 geo_shap
e,两个图形之间的关系有:相交
、包含
、不相交
。
新建索引:
javascript
PUT geo_shape
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"location":{
"type": "geo_shape"
}
}
}
}
添加一条线:
javascript
PUT geo_shape/_doc/1
{
"name":"西安-郑州",
"location":{
"type":"linestring",
"coordinates":[
[108.9404296875,34.279914398549934],
[113.66455078125,34.768691457552706]
]
}
}
查询某一个图形中是否包含该线:
javascript
GET geo_shape/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": [
{
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [
[
106.5234375,
36.80928470205937
],
[
115.33447265625,
32.24997445586331
]
]
},
"relation": "within"
}
}
}
]
}
}
}
relation
属性表示两个图形的关系:
1、within 包含
2、intersects 相交
3、disjoint 不相交
二、特殊查询
1、内容推荐查询:more_like_this query
more_like_this query
可以实现基于内容的推荐,给定一篇文章,可以查询出和该文章相似的内容。
javascript
GET books/_search
{
"query": {
"more_like_this": {
"fields": [
"info"
],
"like": "大学战略",
"min_term_freq": 1,
"max_query_terms": 12
}
}
}
说明
:
1、
fields
:要匹配的字段,可以有多个。2、
like
:要匹配的文本。3、
min_term_freq
:词项的最低频率,默认是 2。特别注意,这个是指词项在要匹配的文本中的频率,而不是 es 文档中的频率 。4、
max_query_terms
:query 中包含的最大词项数目。5、
min_doc_freq
:最小的文档频率,搜索的词,至少在多少个文档中出现,少于指定数目,该词会被忽略。6、
max_doc_freq
:最大文档频率。7、
analyzer
:分词器,默认使用字段的分词器8、
stop_words
:停用词列表。9、minmum_should_match
2、脚本查询:script query
脚本查询,例如查询所有价格大于 200 的图书:
javascript
GET books/_search
{
"query": {
"bool": {
"filter": [
{
"script": {
"script": {
"lang": "painless",
"source": "if(doc['price'].size()!=0){doc['price'].value > 200}"
}
}
}
]
}
}
}
3、percolate query
percolate query 译作渗透查询或者反向查询。
- 1、正常操作:根据查询语句找到对应的文档 query->document
- 2、percolate query:根据文档,返回与之匹配的查询语句,document->query
应用场景:价格监控、库存报警、股票警告等等
例如阈值告警,假设指定字段值大于阈值,报警提示。
percolate mapping 定义:
javascript
PUT log
{
"mappings": {
"properties": {
"threshold":{
"type": "long"
},
"count":{
"type": "long"
},
"query":{
"type":"percolator"
}
}
}
}
percolator 类型相当于 keyword、long 以及 integer 等。
插入文档:
javascript
PUT log/_doc/1
{
"threshold":10,
"query":{
"bool":{
"must":{
"range":{
"count":{
"gt":10
}
}
}
}
}
}
查询:
javascript
GET log/_search
{
"query": {
"percolate": {
"field": "query",
"documents": [
{
"count":3
},
{
"count":6
},
{
"count":90
},
{
"count":12
},
{
"count":15
}
]
}
}
}
查询结果中会列出不满足条件的文档。
查询结果中的 _percolator_document_slot
字段表示文档的 position,从 0 开始计。
总结
上面简单介绍了ES中比较少用的查询方法,更多可以查看官网。