Elasticsearch:Elasticsearch percolate 查询

news2025/1/16 12:58:27

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 }

创建 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"
      }
    }
  }
}

让我们保存一个用户想要提醒的 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
            }
          }
        }
      ]
    }
  }
}

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

POST products/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "brand.keyword": {
              "value": "Apple"
            }
          }
        },
        {
          "term": {
            "model.keyword": {
              "value": "iphone 12"
            }
          }
        },
        {
          "range": {
            "price": {
              "lte": 500
            }
          }
        }
      ]
    }
  }
}

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

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 0,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  }
}

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

让我们添加价格为 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
        }
      ]
    }
  }
}

你将收到类似于正常查询响应的响应,字段 _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
          ]
        }
      }
    ]
  }
}

其次,你可以提供现有索引中的文档 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
          ]
        }
      }
    ]
  }
}

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

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

为什么要 percolate 而不是 watcher?

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

我希望本文能让你非常简单地掌握 percolate 查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10.Java方法学习知识点大全

文章目录前言一、什么是方法1.什么是方法?2.实际开发中,什么时候用到方法?3.实际开发中,方法有什么好处?二、最简单的方法定义和调用1.方法的格式2.方法的调用3.看代码说结果4.为什么要有带参数的方法呢?三、带参数的方法定义和调用1.带参数的方法定义和调用2.形参和实参3.…

NuSphere PhpED Pro 19.5 Crack

PhpED是PHP&#xff08;PHP IDE&#xff09;&#xff0c;HTML&#xff0c;CSS&#xff0c;XML&#xff0c;SMARTY&#xff0c;XHTML等的I ntegated Development Environment。 高级代码编辑器、可靠的 dbg 调试器、高效的数据库连接客户端以及快速安全的部署能力的平衡组合使 P…

90. 注意力分数及代码实现

1. 注意力分数 2. 拓展到高维度 3. Additive Attention ps&#xff1a; 这种的好处是&#xff0c;key&#xff0c;value&#xff0c;query的长度可以不一样 4. Scaled Dot-Product Attention n个query&#xff0c;m个key-value 对最后的结果是n x m的矩阵&#xff0c;第i行就表…

LeetCode[684]冗余连接

难度&#xff1a;中等题目&#xff1a;树可以看成是一个连通且 无环 的 无向 图。给定往一棵 n个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1到 n中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n的二维数组…

Python 压缩 css 文件,第三方模块推荐

本篇博客为大家详细介绍一下如何在 Python 中压缩 CSS 文件。 正式开始前&#xff0c;需要准备一个未压缩过的 CSS 文件。 Python 压缩 csscsscompressor 库使用在 Flask 中压缩 css 文件cssmin 库的用法rcssmin 库的用法总结csscompressor 库使用 在 Python 中可以使用多种方…

CSS之浮动以及清除浮动的几种方式

一. 什么是 CSS Float&#xff08;浮动&#xff09; CSS 的 Float&#xff08;浮动&#xff09;&#xff0c;会使元素向左或向右移动&#xff0c;其周围的元素也会重新排列。 Float&#xff08;浮动&#xff09;&#xff0c;往往是用于图像&#xff0c;但它在布局时一样非常有…

【大数据管理】Java实现字典树TireTree

实现字典树&#xff0c;支持插入和删除&#xff0c;能够打印每一层的数据示例数据“SJ”, “SHJ”, “SGYY”,"HGL" ,将这些数据插入前缀树&#xff0c;打印树&#xff0c;修改SHZ为SHHZ 解题思路 Trie树即字典树&#xff0c;又称单词查找树或键树&#xff0c;是一…

Linux下进程控制详解

目录 一、进程创建 1.1 初识fork 1.2 函数返回值 1.3 写时拷贝技术 1.4 fork函数的使用场景 1.5 fork函数的失败原因 二、进程终止 2.1 进程退出场景 2.2 进程退出码 2.3 进程正常退出方法 2.3.1 exit函数 2.3.2 _exit函数 2.3.3 return方法 2.3.4 方法分析对比 …

【LINUX修行之路】——工具篇gcc/g++的使用和自动化构建工具make/makefile

学习范围&#xff1a;✔️LINUX ✔️ gcc/g✔️make/makefile作者 &#xff1a;蓝色学者 文章目录一、前言二、概念什么是gcc/g&#xff1f;什么是make/makefile&#xff1f;三、教程3.1gcc/g命令3.2make/makefile依赖关系依赖方法编写makefile文件四、资源一、前言 欢迎大家来…

谷粒学院——Day20【项目总结】

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

计算机组成原理实验-logisim实现自动售糖机

一.作业内容; 二.设计分析&#xff1a; 首先我们先确定输入和输出&#xff0c;根据题目的提示很明显可以看出因为每次可以投入10元或者5元硬币&#xff0c;当总钱数达到15元或者超过15元的时候&#xff0c;自动出糖&#xff0c;并且机器不找零&#xff0c;所以可以看出最大的钱…

基于 V2G 技术的电动汽车实时调度策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

第九层(2):STL之string类

文章目录前情回顾string类string类的本质string与char*的区别string类的特点string类的构造函数string类内的字符串追加函数string类内的字符串查找函数string类内的字符串替换函数string类内的字符串比较函数string类内的字符单个访问函数string类内的插入函数string类内的删除…

最小化最大值+拓扑排序要点+概率

今天嫖来的两道题&#xff1a; D.ScoreofaTreeD. Score of a TreeD.ScoreofaTree E.EdgeReverseE. Edge ReverseE.EdgeReverse DDD题是比较离谱的一道题&#xff0c;你在做的时候好像是dp&#xff0c;但是选择的情况太多了&#xff0c;其实对于每一个节点来说&#xff0c;除了叶…

fpga实操训练(fpga和cpu之间的配合)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 cpu和fpga之间,各有各的优势,cpu开发比较快捷,程序员比较好找;fpga对于基础运算效率高,但是找人不好找。实际产品的开发中,一般cpu负责需要接口定义和个性化定制的地方,而fp…

【Datewhale一起吃瓜 Task3】啃瓜第四章

文章目录决策树学习过程预测过程如何划分信息熵信息增益增益率基尼指数泛化能力关键&#xff1a;剪枝预剪枝后剪枝比较缺失值处理&#xff1a;样本赋权&#xff0c;权重划分决策树 决策树基于“树”结构进行决策 每个内部节点对应于某个属性上的测试每个分支对应于该属性的某个…

OpenGL ES着色器语言(GLSL ES)规范 ——下篇

文章目录前言分支和循环if、if-elseforcontinue、break、discard着色器内置变量函数函数定义规范声明webgl内置函数存储限定字constattributeuniformvarying精度限定字预处理指令总结前言 本篇接上文继续对着色器语言规范进行讲解&#xff0c;本文的内容包括&#xff1a;分支和…

Windows下JetBrains GoLand环境配置记录

闲来无事&#xff0c;go go go 这篇文章不是最简单的配置方法&#xff0c;相对简单的配置方法见文末引用。 本文记录了我遇见的一些问题以及解决方案与解释。 Go编译环境配置 首先得前往谷歌的网站下载go语言的镜像文件&#xff1a; Downloads - The Go Programming Languag…

1. 数据仓库维度建模简介

数据仓库的设计目的软件产品来源于用户的需求&#xff0c;因此&#xff0c;在深入数据仓库的设计之前&#xff0c;我们需要了解客户的痛点有哪些&#xff0c;整理如下&#xff1a;我们收集了海量的数据&#xff0c;但无法对其访问&#xff1b;我们需要以各种方式方便的对数据进…

C C++实现两矩阵相乘--模拟法

目录前言数学中两矩阵怎么相乘?C/C语言实现运行结果前言 11月左右大三找日常实习的时候&#xff0c;面试乱杀&#xff0c;但是笔试碰到了这个矩阵相乘的编程题有几次&#xff0c;可能脑瓜子晕&#xff0c;突然被绕来绕去写不出来&#xff0c;很无语&#xff0c;现在总结一下;…