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

相关推荐
Rabbit_QL1 小时前
【Git基础】02——分支:在不破坏主线的情况下做实验
大数据·git·elasticsearch
切糕师学AI1 小时前
Elasticsearch Learning to Rank 完全指南
大数据·elasticsearch·机器学习·搜索引擎
世人万千丶1 小时前
解决鸿蒙方向的Flutter框架版切换问题-当前最新版本3.35.8——工具切换与命令切换
学习·flutter·elasticsearch·华为·harmonyos·鸿蒙
Elastic 中国社区官方博客12 小时前
通过自主 IT 平台和 Elastic 迈出可观测性的下一步
大数据·elasticsearch·搜索引擎·全文检索·可用性测试
Keep Running *1 天前
ElasticSearch_学习笔记
elasticsearch·搜索引擎
切糕师学AI1 天前
Elasticsearch RRF(倒数排序融合)技术详解与实践
算法·elasticsearch·搜索引擎·混合搜索·rrf·归一化问题
Elasticsearch1 天前
如何比较两个 Elasticsearch 索引并找出缺失的文档
elasticsearch
海兰1 天前
使用 Elastic Workflows 监控 Kibana 仪表板访问数据
android·人工智能·elasticsearch·rxjava
希望永不加班1 天前
SpringBoot 整合 Elasticsearch 实现全文检索
java·spring boot·后端·elasticsearch·全文检索
risc1234561 天前
【Elasticsearch】副本分片(Replica Shard)的 globalCheckpoint 更新与推进机制
elasticsearch