Elasticsearch percolate 查询示例详解

目录
  • Elasticsearch 通常如何工作?
  • 什么是 percolate 查询?
  • Percolate 用例
    • Percolate query 实施
    • 创建 percolate 索引:
      • 如何将 Percolate 与你的应用程序集成
      • 为什么要 percolate 而不是 watcher?
  • Percolate query API

Elasticsearch 通常如何工作?

我们将文档索引到 Elasticsearch 中并对其运行查询以获得满足提供的搜索条件的文档。 我们构造一个匹配或术语查询作为输入,匹配查询的文档作为结果返回。

但这不是 percolate query 的情况.....

让我们看看这篇文章中的 percolate 查询,看看它有什么用处。

什么是 percolate 查询?

它与 Elasticsearch 搜索的一般工作方式相反。 在 Percolate Query 中,你将提供文档作为输入,以从与输入文档匹配的索引中查找 query。 可以根据已保存的查询使用 Percolate Query 对文档进行分类或标记。

Percolate query 调用 Elasticsearch 经典搜索的逆向 因为,

  • query 将被存储而不是 Elasticsearch 索引中的文档。
  • 文档将用于代替搜索请求中的 query。

Elasticsearch 将生成与输入文档匹配的查询列表。
你可能想知道为什么我需要 Percolate 以及如何使用它? 因此,让我们看看下面的一些用例。

Percolate 用例

基于 percolate query 上面的描述,我们可以把它应用于如下的一些查询用例:

  • 假设你正在开发一家在线商店,并提供在特定产品在特定价格范围内或以特定折扣上市时创建提醒的功能。
  • 你正在创建推文或帖子分析,并且需要只考虑符合特定条款或条件的内容。 此外,每条满足特定要求的推文或帖子都需要使用特定标签进行标记。

Percolate query 实施

让我们通过一个在线商店用例来更详细地探索 Percolate。

假设消费者希望在 Apple iPhone 12 售价 500 美元时收到通知。

brand:apple AND price<500 AND model:'iphone 12'

使用一些示例数据创建 products 索引:

`
 PUT products
 {
   "mappings": {
     "properties": {
       "brand": {
         "type": "text",
         "fields": {
           "keyword": {
             "type": "keyword"
            }
          }
        },
        "model": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        },
        "price": {
          "type": "long"
        }
      }
    }
  }
  PUT products/_bulk
  { "index" : { "_id": "prod101" } }
  { "brand" : "Apple", "model" : "iphone 11", "price": 800 }
  { "index" : { "_id": "prod102" } }
  { "brand" : "Samsung", "model" : "galaxy m32", "price": 700 }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

创建 percolate 索引:

必须将原始索引中的相同字段映射添加到 percolate 索引中。 只有需要搜索的字段必须从原始索引的映射中复制。

`
 PUT product_percolate
 {
   "mappings": {
     "properties": {
       "query": {
         "type": "percolator"
       },
       "brand": {
         "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        },
        "model": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        },
        "price": {
          "type": "long"
        }
      }
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

让我们保存一个用户想要提醒的 query:

`
 PUT product_percolate/_doc/user1_iphone_12
 {
   "query": {
     "bool": {
       "must": [
         {
           "term": {
             "brand.keyword": {
               "value": "Apple"
              }
            }
          },
          {
            "term": {
              "model.keyword": {
                "value": "iphone 12"
              }
            }
          },
          {
            "range": {
              "price": {
                "lte": 500
              }
            }
          }
        ]
      }
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

现在进行产品查询时,将不会返回任何结果,因为所有 iPhone 12 不低于 500 美元。

`
 POST products/_search
 {
   "query": {
     "bool": {
       "must": [
         {
           "term": {
             "brand.keyword": {
               "value": "Apple"
              }
            }
          },
          {
            "term": {
              "model.keyword": {
                "value": "iphone 12"
              }
            }
          },
          {
            "range": {
              "price": {
                "lte": 500
              }
            }
          }
        ]
      }
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

上面的搜索将返回如下的结果:

`
 {
   "took": 1,
   "timed_out": false,
   "_shards": {
     "total": 1,
     "successful": 1,
     "skipped": 0,
     "failed": 0
   },
    "hits": {
      "total": {
        "value": 0,
        "relation": "eq"
      },
      "max_score": null,
      "hits": []
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

上面的结果表明,没有一个产品满足我们的搜索条件。

让我们添加价格为 499 的新产品 iPhone 12:

  POST product/_doc/prod104
  {
    "brand": "Apple",
    "model": "iphone 12",
    "price": 499
  }

不会发送自动通知,因为在索引文档时不会运行 percolate 查询。 percolate 查询必须手动运行。

Percolate query API

你可以通过两种方式执行 percolate query:

首先,你可以使用单个文档或多个文档作为输入运行 percolate,如下所示:

单个文档

 GET product_percolate/_search
 {
   "query": {
     "percolate": {
       "field": "query",
       "document": {
         "brand": "Apple",
         "model": "iphone 12",
         "price": 499
        }
      }
    }
  }

多个文档

`
 GET product_percolate/_search
 {
   "query": {
     "percolate": {
       "field": "query",
       "documents": [
         {
           "brand": "Apple",
           "model": "iphone 12 pro",
            "price": 600
          },
          {
            "brand": "Apple",
            "model": "iphone 12",
            "price": 499
          }
        ]
      }
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

你将收到类似于正常查询响应的响应,字段 _source 将显示匹配的查询,但字段 _percolator_document_slot 将显示在这种情况下多个文档中匹配的文档的位置。

`
 {
   "took": 3,
   "timed_out": false,
   "_shards": {
     "total": 1,
     "successful": 1,
     "skipped": 0,
     "failed": 0
   },
    "hits": {
      "total": {
        "value": 1,
        "relation": "eq"
      },
      "max_score": 1.2615292,
      "hits": [
        {
          "_index": "product_percolate",
          "_id": "user1_iphone_12",
          "_score": 1.2615292,
          "_source": {
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "brand.keyword": {
                        "value": "Apple"
                      }
                    }
                  },
                  {
                    "term": {
                      "model.keyword": {
                        "value": "iphone 12"
                      }
                    }
                  },
                  {
                    "range": {
                      "price": {
                        "lte": 500
                      }
                    }
                  }
                ]
              }
            }
          },
          "fields": {
            "_percolator_document_slot": [
              0
            ]
          }
        }
      ]
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

其次,你可以提供现有索引中的文档 ID,如下所示(目前不支持传递多个 ID):

  GET product_percolate/_search
  {
    "query": {
      "percolate": {
        "field": "query",
        "index": "product",
        "id": "prod104"
      }
    }
  }

上面的查询的结果为:

`
 {
   "took": 7,
   "timed_out": false,
   "_shards": {
     "total": 1,
     "successful": 1,
     "skipped": 0,
     "failed": 0
   },
    "hits": {
      "total": {
        "value": 1,
        "relation": "eq"
      },
      "max_score": 1.2615292,
      "hits": [
        {
          "_index": "product_percolate",
          "_id": "user1_iphone_12",
          "_score": 1.2615292,
          "_source": {
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "brand.keyword": {
                        "value": "Apple"
                      }
                    }
                  },
                  {
                    "term": {
                      "model.keyword": {
                        "value": "iphone 12"
                      }
                    }
                  },
                  {
                    "range": {
                      "price": {
                        "lte": 500
                      }
                    }
                  }
                ]
              }
            }
          },
          "fields": {
            "_percolator_document_slot": [
              0
            ]
          }
        }
      ]
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

如何将 Percolate 与你的应用程序集成

  • 如果你使用 Logstash 为数据编制索引,则可以使用 Elasticsearch 过滤器插件并运行过滤查询以查看传入文档是否与任何已保存的查询匹配。 如果是这样,你可以使用单独的输出插件向用户发送通知。
  • 如果自定义连接器用于数据索引,则 Elastic 客户端可用于运行 percolate query 并直接从连接器发送通知。

为什么要 percolate 而不是 watcher?

相对于percolate,watcher 不太适合需要实时匹配的场景。 是的,相比之下还有更多的争论空间,但暂时,我认为这不在本博客的范围之内。

以上就是Elasticsearch percolate 查询示例详解的详细内容,我希望本文能让你非常简单地掌握 percolate 查询,更多关于Elasticsearch percolate查询的资料请关注我们其它相关文章!

(0)

相关推荐

  • Elasticsearch聚合查询及排序操作示例

    目录 1 es排序 2 match和match的区别 3 分页查询 4 es 组合查询 5 结果过滤展示字端 6 结果高亮展示 7 聚合查询avg.max.min.sum.分组 8 mapping和_template模版 9 ik分词 10 term和match的区别 1 es排序 # 1 排序 GET jeff/doc/_search { "query": { "match": { "from": "gu" } }, &qu

  • Elasticsearch查询及聚合类DSL语句宝典示例详解

    目录 前言 一.match 二.match_phrase 三.mult_match 四.term 五.terms 六.range 七.wildcard 八.regexp 九.组合多查询(bool查询) 十.聚合 前言 随着使用es场景的增多,工作当中避免不了去使用es进行数据的存储,在数据存储到es当中以后就需要使用DSL语句进行数据的查询.聚合等操作,DSL对SE的意义就像SQL对MySQL一样,学会如何编写查询语句决定了后期是否能完全驾驭ES,所以至关重要,本专题主要是分享常用的DSL语句,

  • go语言实现Elasticsearches批量修改查询及发送MQ操作示例

    目录 update_by_query批量修改 索引添加字段 查询es发送MQ update_by_query批量修改 POST post-v1_1-2021.02,post-v1_1-2021.03,post-v1_1-2021.04/_update_by_query { "query": { "bool": { "must": [ { "term": { "join_field": { "val

  • ElasticSearch事件查询语言EQL操作

    目录 前述 EQL优点 基础语法 数据准备 数据窗口搜索 统计符合条件的事件 事件序列 安全检测 数据准备 获取regsvr32事件的计数 检查命令行参数 检查恶意脚本加载 检查攻击成功可能性 前述 EQL 的全名是 Event Query Language (EQL).事件查询语言(EQL)是一种用于基于事件的时间序列数据(例如日志,指标和跟踪)的查询语言.在 Elastic Security 平台上,当输入有效的 EQL 时,查询会在数据节点上编译,执行查询并返回结果.这一切都快速.并行地发

  • Elasticsearch之基本查询及组合查询操作示例

    目录 Elasticsearch查询 一 基本查询 1.1 match查询 1.2 term查询 1.3 terms查询 1.4 控制查询的返回数量(分页) 1.5 match_all 查询 1.6 match_phrase查询 1.7 multi_match 1.8 指定返回的字段 1.9 sort 结果排序 1.10 range范围查询 1.11 wildcard查询 1.12 exists存在 二 组合查询 2.1 bool查询 2.2 简单过滤查询 2.3 查询多个值 2.4 bool过

  • Elasticsearch percolate 查询示例详解

    目录 Elasticsearch 通常如何工作? 什么是 percolate 查询? Percolate 用例 Percolate query 实施 创建 percolate 索引: 如何将 Percolate 与你的应用程序集成 为什么要 percolate 而不是 watcher? Percolate query API Elasticsearch 通常如何工作? 我们将文档索引到 Elasticsearch 中并对其运行查询以获得满足提供的搜索条件的文档. 我们构造一个匹配或术语查询作为输

  • SpringBoot框架集成ElasticSearch实现过程示例详解

    目录 依赖 与SpringBoot集成 配置类 实体类 测试例子 RestHighLevelClient直接操作 索引操作 文档操作 检索操作 依赖 SpringBoot版本:2.4.2 <dependencies> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <opti

  • MySql中子查询内查询示例详解

    西北望乡何处是,东南见月几回圆. 月亮又慢悠悠的挂上了天空,趁着睡前梦呓,我就带领各位可爱的读者们探索MySql最后的子查询部分. 说明:有些查询结果出来结果截图与题目要求不一样会出现多余的字段是为了方便展示结果的可读性.实际操作的读者可以删除SELECT后面多余的字段得到正确的结果. #WHERE或HAVING后面 #1.标量子查询(单行子查询) #2.列子查询(多行子查询) #3.行子查询(多列多行) #特点: # ①子查询放在小括号内 # ②子查询一般放在条件的右侧 # ③标量子查询:一般

  • MySQL教程子查询示例详解

    目录 1.什么是子查询? 2.子查询可以出现的位置有哪些? 3.where子查询 4.from后面使用子查询.(太重要了) 1.什么是子查询? 当一个查询是另外一个查询的一部分时,我们将内层的查询叫做子查询,外层的查询叫做主查询. 2.子查询可以出现的位置有哪些? select ..(select). from ..(select). where ..(select). 从上面可以看出,子查询常常出现在三个地方,select后面可以跟子查询:from后面可以跟子查询:where后面可以跟子查询;

  • MyBatis 和 jeesite多表查询示例详解

    有时候经常碰到多级联查,比如通过某个功能A表查角色信息,但是A表和角色表没有直接的关联关系,需要通过用户表进行关联,所以就需要多级关联查询出来了(下面的只是举例,实际应用用户和角色不会这样设计字段) 一.MyBatis xml文件手写resultMap和查询语句 1.MyBatis配置文件:因为是通过column(数据库字段名称)和property(实体类对象名称)进行数据绑定的,如果存在相同字段的名字可以用as修改字段名称也能进行特殊绑定 <resultMap type="User&qu

  • Elasticsearch Analyzer 内置分词器使用示例详解

    目录 前置知识 1.Analyzer 2.Elasticsearch 内置分词器 3. Standard Analyzer 3.1 Definition 3.2 Configuration 3.3 实验 4. Simple Analyzer 4.1 Definition 4.2 Configuation 4.3 实验 5. Stop Analyzer 5.1 Definition 5.2 Configuration 5.3 实验 6. Whitespace Analyzer 6.1 Defini

  • MySQL系列多表连接查询92及99语法示例详解教程

    目录 1.笛卡尔积现象 2.连接查询知识点概括 1)什么是连接查询? 2)连接查询的分类 3.内连接讲解 1)等值连接:最大特点是,连接条件为等量关系. 2)sql92语法和sql99语法的区别. 3)非等值连接:最大特点是,连接条件为非等量关系. 4)自连接:最大特点是,一张表看作两张表. 4.外连接讲解 1)什么是外连接,和内连接有什么区别? 2)外连接的分类 前面两天带着大家换了一个口味,带着大家学习了pyecharts的原理和部分图形制作.今天我们继续回归带你学MySQL系列,带着大家继

  • JS递归遍历查询是否有权限示例详解

    目录 前言 需求分析 设计思路 代码 声明查找模板如下 js 版本 ts 版本 后记 前言 最近参与了一个基于 qiankun 构建的微前端大型项目,涉及到十几个子应用,基于基座独立开发了一个完善的权限中心模块.而权限中心中涉及到了 模块 > 一级菜单 > N级菜单/按钮 结构的权限管理. 这次的需求是在其中一个子应用的按钮级别的权限管理,在鉴权阶段写了一个小的方法,用来从权限树中查询是否有某一个按钮的权限,从而控制用户对于按钮的使用权限. 需求分析 权限的每一层对应的子菜单的键不尽相同. 在

  • Mybatis查询延迟加载详解及实例

    Mybatis查询延迟加载详解及实例 1.1     启用延迟加载 Mybatis的延迟加载是针对嵌套查询而言的,是指在进行查询的时候先只查询最外层的SQL,对于内层SQL将在需要使用的时候才查询出来.Mybatis的延迟加载默认是关闭的,即默认是一次就将所有的嵌套SQL一并查了将对象所有的信息都查询出来.开启延迟加载有两种方式. 第一种是在对应的<collection>或<association>标签上指定fetchType属性值为"lazy".如下示例中我们

  • ThinkPHP Where 条件中常用表达式示例(详解)

    Where 条件表达式格式为: $map['字段名'] = array('表达式', '操作条件'); 其中 $map 是一个普通的数组变量,可以根据自己需求而命名.上述格式中的表达式实际是运算符的意义: ThinkPHP运算符 与 SQL运算符 对照表 TP运算符 SQL运算符 例子 实际查询条件 eq = $map['id'] = array('eq',100); 等效于:$map['id'] = 100; neq != $map['id'] = array('neq',100); id !

随机推荐