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

相关推荐
Dragon--Z4 小时前
更换ES集群版本后设置密码时遇到的错误及解决方案
elasticsearch
东华果汁哥11 小时前
【centos8 ES】Elasticsearch linux 龙晰8操作系统安装
linux·elasticsearch·jenkins
weixin_4373982114 小时前
Elasticsearch学习(1) : 简介、索引库操作、文档操作、RestAPI、RestClient操作
java·大数据·spring boot·后端·学习·elasticsearch·全文检索
安的列斯凯奇14 小时前
Elasticsearch—索引库操作(增删查改)
大数据·elasticsearch·搜索引擎
淡黄的Cherry14 小时前
ELFK日志采集实战
elasticsearch
sleP4o17 小时前
Git的学习和常见问题
git·学习·elasticsearch
Elastic 中国社区官方博客18 小时前
Elasticsearch:使用 Playground 与你的 PDF 聊天
大数据·人工智能·elasticsearch·搜索引擎·ai·pdf·全文检索
张紫娃20 小时前
Git 的引用规格(refspec)语法
大数据·git·elasticsearch
SRETalk1 天前
夜莺监控支持 ES 日志告警了
elasticsearch·日志监控·开源监控·夜莺监控·es监控