ElasticSearch7.x入门教程之全文搜索(九)

文章目录

  • 前言
  • 一、地理位置查询
    • [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_shape,两个图形之间的关系有:相交包含不相交

新建索引:

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中比较少用的查询方法,更多可以查看官网。

相关推荐
wenwen201412071 小时前
linux上jdk1.8安装elasticsearch6.8.5踩坑总结
linux·运维·服务器·elasticsearch·jdk·jenkins
Elastic 中国社区官方博客1 小时前
使用数据层进行数据生命周期管理
大数据·数据库·elasticsearch·搜索引擎·全文检索·时序数据库
小黑屋说YYDS2 小时前
ElasticSearch7.x入门教程之全文搜索聚合分析(十)
elasticsearch
forestsea3 小时前
【Elasticsearch】实现分布式系统日志高效追踪
大数据·elasticsearch·搜索引擎·日志搜索
Elastic 中国社区官方博客4 小时前
使用历史索引监控 Elasticsearch 索引生命周期管理
大数据·数据库·elasticsearch·搜索引擎·全文检索·时序数据库
动态一时爽,重构火葬场19 小时前
elasticsearch是如何进行搜索的?
大数据·elasticsearch·搜索引擎
P.H. Infinity19 小时前
【Elasticsearch】06-JavaRestClient查询
大数据·elasticsearch·搜索引擎
羽_羊1 天前
Elasticsearch scroll 之滚动查询
elasticsearch·scroll
URBBRGROUN4671 天前
Spring Data Elasticsearch
java·spring·elasticsearch