技术标签: Elasticsearch elasticsearch 数据库 大数据
Elasticsearch 是功能强大的功能丰富的工具。在今天的文章中,我来介绍一下 Percolator 数据类型。同时也介绍一下 Percolate query。 您需要基本了解 Elasticsearch,尤其是映射和搜索。
Elasticsearch 的正常工作流程是将文档(作为JSON数据)存储在索引中,并执行搜索(也是JSON数据)以向索引询问有关这些文档的信息。简而言之,Percolate 可以逆转这种情况。 你存储 search 并使用文档询问有关这些搜索的索引。 是的,但这并不是特别可行的信息。 多年来,如何构造 percolator,以至于我们可以给出更有用的解释。
现在,Percolation 围绕 percolator 映射字段类型展开。 与其他任何字段类型一样,不同的是它希望你将搜索文档分配为该值。 当你存储数据时,索引会将此搜索文档处理为可执行形式,并将其保存以备后用。
Percolate query 接受一个或多个文档,并将结果限制为那些存储的搜索至少匹配一个文档的文档。 搜索时,渗滤查询的工作原理与任何其他查询元素一样。
在底层,这是以你期望的方式实现的:具有 percolate 字段的索引保留一个隐藏的(内存中)索引。首先,将在 percolate query 中列出的文档放入该索引,然后对该索引执行常规查询,以查看原始的含 percolate 字段的文档是否匹配。
要记住的重要一点是,该隐藏索引是从原始 percolator 索引获取其映射的。因此,用于 percolate query 的索引需要具有适合原始数据和查询文档数据的映射。
这引入了一些管理问题,因为你的索引数据和 percolate query 文档可能以不同的方式使用同一字段。一个简单的答案是使用对象类型 (object type) 将与 percolate 相关的映射与普通文档映射隔分开。
假设你使用的查询最初是为实际文档的另一个索引编写的,那么最直接的方法是将数据隔离衣避免数据直接写到 percolate 索引中去,并将根级别传递给 percolate query文档的映射定义。
另外,由于渗滤字段被解析为搜索并在索引时保存,因此你可能需要在升级后重新索引 Percolate 文档,以利用对系统的任何优化。
在此示例中,我们将建立一个索引,该索引含有保存的玩具名字和玩具价格搜索。 其背后的想法是,用户应该能够输入搜索字词和最高价格,然后在与该字词匹配的商品价格低于此价格时立即得到通知。 用户还应该能够打开和关闭这些通知。下面的映射实现了 percolate 索引来支持此功能。 与保存的搜索本身相关的字段位于搜索对象中,而与原始玩具相关的字段位于映射的根级别。
首先,我们使用如下的命令来生产一个索引:
PUT toys
{
"mappings": {
"properties": {
"search": {
"properties": {
"query": {
"type": "percolator"
},
"user_id": {
"type": "integer"
},
"enabled": {
"type": "boolean"
}
}
},
"price": {
"type": "float"
},
"description": {
"type": "text"
}
}
}
}
我们接着使用如下的命令写入一个文档:
PUT toys/_doc/1
{
"search": {
"user_id": 5,
"enabled": true,
"query": {
"bool": {
"filter": [
{
"match": {
"description": {
"query": "nintendo switch"
}
}
},
{
"range": {
"price": {
"lte": 300
}
}
}
]
}
}
}
}
请注意,我们仅将数据存储在 search 对象字段中。 price 和 description 的映射仅用于支持 percolate query。
在查询时,我们要同时使用普通对象字段和“特殊” percolator 字段。 此查询将在用户搜索中检查是否有当前启用的搜索与文档匹配。
GET toys/_search
{
"query": {
"bool": {
"filter": [
{
"percolate": {
"field": "search.query",
"document": {
"description": "Nintendo Switch",
"price": 250
}
}
},
{
"term": {
"search.enabled": true
}
},
{
"term": {
"search.user_id": 5
}
}
]
}
}
}
请注意,它结合了针对字段中存储的查询和常规术语查询的文档的 percolator 匹配,以限制基于其启用状态和 user_id 测试的文档。运行上面的指令后,我们可以看到如下的结果:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.0,
"hits" : [
{
"_index" : "toys",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.0,
"_source" : {
"search" : {
"user_id" : 5,
"enabled" : true,
"query" : {
"bool" : {
"filter" : [
{
"match" : {
"description" : {
"query" : "nintendo switch"
}
}
},
{
"range" : {
"price" : {
"lte" : 300
}
}
}
]
}
}
}
},
"fields" : {
"_percolator_document_slot" : [
0
]
}
}
]
}
}
如果我们该用如下的搜索:
GET toys/_search
{
"query": {
"bool": {
"filter": [
{
"percolate": {
"field": "search.query",
"document": {
"description": "Nintendo Switch",
"price": 500
}
}
},
{
"term": {
"search.enabled": true
}
},
{
"term": {
"search.user_id": 5
}
}
]
}
}
}
我们将找不到任何的结果:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
我们想创建一个 percolator 来匹配 body 字段中的一些文本。 我们可以像这样定义映射:
PUT test-percolator
{
"mappings": {
"properties": {
"query": {
"type": "percolator"
},
"body": {
"type": "text"
}
}
}
}
现在,我们可以在其中存储一个带有过 percolator 查询的文档,如下所示:
PUT test-percolator/_doc/1?refresh
{
"query": {
"match": {
"body": "quick brown fox"
}
}
}
现在,让我们对其执行搜索,如以下代码所示:
GET test-percolator/_search?filter_path=**.hits
{
"query": {
"percolate": {
"field": "query",
"document": {
"body": "fox jumps over the lazy dog"
}
}
}
}
这将导致我们检索存储文档的命中,如下所示:
{
"hits" : {
"hits" : [
{
"_index" : "test-percolator",
"_id" : "1",
"_score" : 0.13076457,
"_source" : {
"query" : {
"match" : {
"body" : "quick brown fox"
}
}
},
"fields" : {
"_percolator_document_slot" : [
0
]
}
}
]
}
}
Percolator 字段在其中存储了一个 Elasticsearch 查询。 因为所有的 percolator 都被缓存并且对于性能总是处于活动状态,所以查询中需要的所有字段都必须在文档的映射中定义。由于所有 percolator 文档中的所有查询都将针对每个文档执行,为了获得最佳性能,必须优化 Percolator 内部的查询,以便它们在 percolator 查询中快速执行。
到现在为止,可能很多人也不一定知道到底为什么要用到这个 percolate query。在实际的使用中,我们可以在 Logstash 的 Elasticsearch 过滤器中针对每一个事件来针对 Elasticsearch 做 query。也即,我们可以知道这个事件是否满足其中的 search,如果是,将会丰富事件的数据。这个练习就留给你们来试。
参考:
【1】Elasticsearch Data Enrichment with Logstash: A Few Security Examples | Elastic Blog
BunyanBunyan(by Trent Mick)是另外一个值得考虑的日志框架,以略微不同的方式处理结构化,机器可读性被重点对待。其结果是,bunyan每行日志记录实际上就是JSON.stringify的一个输出。安装(Installation)npm install bunyan使用(Usage)var bunyan= require('bunyan');var log=bunyan.cre...
目录介绍MM的思想MM过程总结引用介绍MM优化更多地来讲是一种思想,并不特指某种算法,依靠这种思想可以衍生出很多优化算法。我本人并非数学专业人士,最优传输的求解中用到了MM优化算法,所以特意了解并记录了一下,内容浅显,仅涉及皮毛。本文参考了其他博客的相关内容并整理在本文中,后面会附上相关连接,侵删。MM的思想MM算法的思想是这样的:简单来说,就是我想求解某个目标函数JJJ的最小值,但是比较难算,那么我可以新构造一个好求解的目标函数GGG,在满足一定条件的前提下,不断求解GGG的最小值,
单载波调制和OFDM调制单载波的调制:单载波的调制就是采用一个信号载波传送所有的数据信号。无线信道的多路径散射会造成相邻符号之间的干扰,就是我们常说的符号间干扰(ISI)。如果这一信号使有用信号恶化,影响到射频信号的正确解调,那么有两种方法来解决:一种是在接收机端采用均衡器来消除ISI干扰,可以达到接近OFDM调制的误码率。另一种是采用分集天线的方式可以有效地消除这种干扰,即采用两个不同方向的天线
32位未修改源码与修改版的代码下载:?git clone [email protected]:youzhonghui/MiniCRT.gitMiniCRT 64位 linux 系统移植记录MiniCRT是《程序员的自我修养:链接,转载于库》的作者俞甲子写的小型的C运行时库。里面提供了pri
基于centos7 安装6.2版本CM以及CDHCM安装包下载地址:rpm包:https://archive.cloudera.com/cm6/6.2.0/redhat7/yum/RPMS/x86_64/allkeys.asc文件:https://archive.cloudera.com/cm6/6.2.0/allkeys.ascCDH安装包下载地址:https://archive.c...
x86架构——x86平台CPU型号说明(Intel)。
Since WebDynpro follows another programming paradigm, it would be advisable to attend a NET310 etc. course to learn all the details about it -- unless you are an expreienced Web developer in other are
Ethtool是用于查询及设置网卡参数的命令。概要:ethtool ethX //查询ethX网口基本设置ethtool –h //显示ethtool的命令帮助(help)ethtool –i ethX //查询ethX网口的相关信息ethtool –d ethX //查询ethX网口注册性信息ethtool –r ethX /...
有时候想要获得一幅图片里面 某个物体的精确的hsv的值,需要怎么做呢?import cv2import numpy as npfrom matplotlib import pyplot as pltimage=cv2.imread('hsv.png')HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)def getpos(event,x,y,flags...
//本文是博主编写的C Primer Plus第六版(中文版)编程练习答案的所有链接;//使用超链接汇总于此,若是有用请点赞收藏并分享给他人;C Primer Plus 第六版(中文版)第二章(完美修订版)编程练习答案C Primer Plus 第六版(中文版)第三章(完美修订版)编程练习答案C Primer Plus 第六版(中文版)第四章(完美修订版)编程练习答案C Primer Plus 第六版(中文版)第五章(完美修订版)编程练习答案C Primer Plus 第六版(中文版)第六章(完美修订版)编
ES聚合服务-Can't load fielddata on [attrs.attrName] because fielddata is unsupported on fields of type1.问题:2.问题描述3.解决方法1.问题:org.elasticsearch.ElasticsearchException: Elasticsearch exception [type=illegal_argument_exception, reason=Can’t load fielddata on [at
在数据分析中,我们经常会需要数据匹配,比如将事实表与维度表进行匹配来获取维度表中的信息。对此,我们可以通过Power Query中的合并查询,或者在Power Pivot中建立关系而轻易实现,但是前提是匹配列的数据是能对应得上的,如果是模糊匹配,那用以上的方法便会匹配不上。那么在Power Query中怎么进行模糊匹配呢?比如,我们需要给下列左图中的产品匹配上价格:在Power Quer...