Elasticsearch:结合稀疏、密集和地理字段

作者:来自 Elastic Madhusudhan Konda

如何以自定义方式组合多个稀疏、密集和地理字段

Elasticsearch 是一款强大的工具,可用于近乎实时地搜索和分析数据。作为开发人员,我们经常会遇到包含各种不同字段的数据集。有些字段是必填字段,或者包含的数据超过平均水平,而有些字段则很少。缺少许多值的字段称为 “稀疏(sparse)” 字段,而存在大多数值的字段称为 “密集(dense)” 字段。当然,我们还有那些表示地理位置数据的地理位置字段。

在本文中,我们将介绍如何查询具有不同字段的数据。我们将探索稀疏、密集和地理字段的集成,以增强你的搜索功能。我们将介绍实际示例(使用我最喜欢的 books 索引 :) ),通过 Kibana DevTools 将示例数据导入 Elasticsearch 并执行词汇和地理搜索。

在详细介绍如何组合这些字段以提取更深层次的分析能力之前,让我们先定义这些字段。

稀疏字段 - Sparse fields

稀疏字段是并非在每个文档中都存在的字段。

例如,考虑由各种类型的书籍组成的书籍索引。我们的书籍索引中的 special_edition 字段是稀疏的,因为并非所有书籍都以特别版的形式发布。同样,可能还有其他字段(例如 category 或 sales_info)不一定适用于所有书籍。稀疏字段对于根据只有数据集子集拥有的属性来过滤结果很有用。

密集字段 - Dense fields

相反,密集字段是预期会出现在所有或大多数文档中的字段。我们 books 索引中的 title、author、number_of_pages 和 publication_date 等字段被视为密集字段。它们适用于大多数(如果不是所有)图书,并且是每个文档的核心。它们有助于提供可靠的搜索查询。

地理字段 - Geo fields

地理字段允许索引地理数据,从而实现基于位置或地理区域的搜索。在我们的 books 索引中,topic_location 是一个地理字段,可以表示各种基于位置的属性。示例包括作者所在地、图书原版印刷地等。

组合各种字段

以自定义方式组合这些字段可以显著增强搜索功能并提供更相关的结果。在很多用例中,我们想要查询稀疏填充字段与密集字段以及地理字段的组合。

Elasticsearch 的强大之处在于它能够处理组合各种数据类型的复杂查询。通过了解稀疏、密集和地理位置字段的特征,我们可以设计满足特定用户需求的有针对性的搜索查询。

让我们通过实际示例来了解如何使用各种数据字段。

创建 “books” 索引

首先,让我们定义一个 books 索引,其中包含可应用于在线书店的各种字段类型。

正如您在下面的 PUT 请求中看到的,books 索引的映射由一些标准书籍属性组成。但是,你也可以找到一些可能不适用于每本书的字段,例如:

  • available_copies
  • special_edition

这些属性被认为是稀疏的,因为它们不一定需要填充到每本书中。其他字段 title、author、publication_date 字段等预计会出现在每本(或大多数)书籍中。

我们希望将这些字段与可以表示书籍主题位置的地理点字段结合起来:

# Creating books mapping schema

PUT /books
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "author": { "type": "text" },
      "price": { "type": "float" },
      "tags": { "type": "keyword" },
      "publication_date": { "type": "date" },
      "available_copies": { "type": "integer" },
      "special_edition": { "type": "boolean" },
      "topic_location": { "type": "geo_point" },
      "genre": { "type": "keyword" },
      "language": { "type": "keyword" }
    }
  }
}

上面的代码片段向我们展示了图书索引的映射模式。它由多种字段组成 - 稀疏字段、密集字段和地理位置字段。

复制代码片段并将其粘贴到 Kibana 控制台中。执行它将创建我们的 books 索引。

现在我们已经创建了映射,让我们索引一些示例数据。

索引示例数据

我们想索引几本包含代表我们需求的数据的书籍。以下示例文档添加了具有以下属性的书籍:

# Omitting special_edition and technology
# Note the location is Silicon Valley

POST /books/_doc/1
{
  "title": "Head First Java: A Brain-Friendly Guide",
  "author": " Kathy Sierra, Bert Bates, Trisha Gee",
  "price": 43.99,
  "tags": ["programming", "Java", "advanced"],
  "publication_date": "2024-03-20",
  "available_copies": 10,
  "topic_location": { "lat": 37.3861, "lon": -122.0839 },
  "genre": "Technology",
  "language": "English",
  "technology": "Java"
}

# Omitting 'special_edition'
# Note the location is London

POST /books/_doc/2
{
  "title": "Elasticsearch in Action 2e",
  "author": "Madhusudhan Konda",
  "price": 39.99,
  "tags": ["Elasticsearch", "Search", "Technology", "2nd Edition"],
  "publication_date": "2022-07-01",
  "available_copies": 10,
  "topic_location": { "lat": 51.5074, "lon": -0.1278 },
  "genre": "Technology",
  "special_edition": true,
  "language": "English",
  "technology": "Elasticsearch"
}

# Omitting 'available_copies', 'special_edition', and 'topic_location'
POST /books/_doc/3
{
  "title": "Functional Programming in Java",
  "author": "Venkat Subramaniam",
  "price": 36.99,
  "tags": ["Java", "Functional Programming", "Software Development"],
  "publication_date": "2018-03-15",
  "genre": "Technology",
  "language": "English",
  "technology": "Java"
}

如你所见,我们有四本不同的书,每本都有一些字段缺失,从而展示了稀疏字段的概念。

数据准备完成后,下一步是编写有效的查询,让这些不同的字段产生出色的分析见解。

我们将编写以下查询:

  • 查找特定位置附近的 Java 书籍
  • 获取特别版搜索技术书籍
  • 搜索多种语言的最新 IT 书籍

本文的其余部分将介绍如何创建结合稀疏、密集和地理字段的查询。

查找技术中心附近的 Java 书籍

假设我们想查找某个地点(例如 SFO)附近的 Java 书籍。我们想编写一个 bool 查询来匹配某个地理区域内的 Java 书籍。以下查询可完成此任务:

在这里,我们查找硅谷附近的 Java 相关书籍:

# Searching for Java books in Silicon Valley

GET /books/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "technology": "Java" } }
      ],
      "filter": [
        { "geo_distance": { "distance": "100km", "topic_location": { "lat": 37.7749, "lon": -122.4194 } } }
      ]
    }
  }
}

执行此查询将返回 “Slilicon Valley - 硅谷” 及其周边(半径约 100 公里)的 “Java” 书籍。在本例中,将返回 “Head First Java”。

查询结合了字段类型以实现有针对性的搜索目标。查询查找与 “Java”(technology 字段)特别相关的书籍,但这些书籍可能与索引中的所有条目无关。这是一个稀疏字段场景,因为并非所有书籍都填充了 technology 字段。

此示例演示了 Elasticsearch 如何将各种数据类型集成到一个有凝聚力的搜索策略中。

查询特别版搜索技术书籍

假设我们的目标是在我们的数据库中识别特别版书籍,并且这些书籍与 Elasticsearch 等搜索技术有关。此查询会提取可能与有兴趣深入学习该技术的特定受众特别相关的书籍。

我们再次使用 bool 查询来筛选与搜索技术相关的特别版书籍:

# Special edition Technology books

GET /books/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "special_edition": true } },
        { "match": { "technology": "Elasticsearch" } }
      ],
      "should": [
        { "match": { "language": "English" } }
      ],
      "must_not": [
        { "range": { "publication_date": { "lt": "2015-01-01" } } }
      ],
      "minimum_should_match": 1
    }
  }
}

此查询根据 special_edition 字段(稀疏)和 genre 字段(密集)过滤图书。由于 genre 字段可能存在于每个图书文档中,因此查询在整个数据集中变得更具普遍适用性,使其成为密集字段。

除了上述要求外,我们希望图书以英文出版(尽管由于 minimum_should_match 设置为 1,因此这不是严格要求)。这意味着如果图书不是以英文出版的,则不会将其排除在搜索结果之外。但是,如果以 English 出版,这些图书在搜索结果中的排名会更高。

为了完整起见,我还添加了 must_not 子句 - 这将排除 2015 年之前出版的图书。这使我们能够专注于较新的出版物。

本质上,此查询提供了一种平衡的搜索方法:

  • 使用严格的标准按版本和类型过滤图书,
  • 设置对英语的偏好以提高相关性,并且
  • 过滤掉不是最近的(2015 年之前出版)图书以确保仅显示最近的副本。

搜索多种语言的最新 IT 书籍

假设我们的用户可能正在寻找最新的资源(书籍)以了解技术领域的最新动态,但需要以他们的母语(特定)语言访问的材料。这在教育环境、跨国公司或双语人口地区很常见。虽然我不读 “Telugu - 泰卢固语”(一种南印度语言 - 我的家乡 :))的技术书籍,但我知道我的一些朋友希望用他们的母语解释技术内容。

假设我们想找到英语和西班牙语的最新 IT 书籍,这可能表明更广泛的教育价值:

# Recent IT Books Available in Multiple Languages

GET /books/_search
{
  "query": {
    "bool": {
      "must": [
        { "range": { "publication_date": { "gte": "now-2y" } } }
      ],
      "filter": [
        { "terms": { "language": ["English", "Spanish"] } },
        { "match": { "genre": "Technology" } }
      ]
    }
  }
}

让我在 “combined/diverse” 字段的上下文中解释一下查询:

publication_date 可能是一个密集字段,因为它是每本书籍记录中都应有的标准属性。通过使用范围查询,我们关注过去两年内出版的书籍。

同样,genre 通常是书籍数据库中的密集字段,因为书籍通常按类型分类。查询专门针对 “Technology” 类型中的书籍进行过滤。这确保了与 IT 主题相关的书籍。

language 字段可以根据数据集被视为稀疏字段。在全球数据集中,书籍可能有多种语言版本,但并非所有书籍都提供多种语言版本。

通过使用多种语言(在本例中为英语和西班牙语)的 terms 查询进行过滤,我们正在获取迎合多语言受众的书籍。

总结

总结。在本文中,我们了解了各种数据字段(例如稀疏字段、密集字段和地理字段)以及将它们组合起来对我们的数据进行深入分析的机制。

准备好自己尝试一下了吗?开始免费试用。
想要获得 Elastic 认证吗?了解下一期 Elasticsearch 工程师培训何时举行!

原文:Sparse, dense and geo fields: How to combine them efficiently in Elasticsearch — Elastic Search Labs

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法力扣刷题记录 二十八【225. 用队列实现栈】

前言 栈和队列篇。 记录 二十八【225. 用队列实现栈】 一、题目阅读 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void p…

数据库安全审计系统:满足数据安全治理合规要求

伴随着数据库信息价值以及可访问性提升,使得数据库面对来自内部和外部的安全风险大大增加,如违规越权操作、恶意入侵导致机密信息窃取泄漏,但事后却无法有效追溯和审计。 国内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数…

浅谈渗透测试实战

很多时候,在看白帽子们的漏洞的时候总有一种感觉就是把web渗透简单地理解成了发现web系统漏洞进而获取webshell。其实,个人感觉一个完整的渗透(从黑客的角度去思考问题)应该是以尽一切可能获取目标的系统或者服务器的最高权限&…

TCL中环可转债缩水近90亿:业绩持续承压,百亿自有资金购买理财

《港湾商业观察》廖紫雯 日前,TCL中环新能源科技股份有限公司(以下简称:TCL中环,002129.SZ)可转债总额缩水近90亿,引发市场关注。可转债大幅缩水的另一面,公司此前发布公告披露将使用百亿自有资…

深入详解RocketMQ源码安装与调试

1.源码下载 http://rocketmq.apache.org/dowloading/releases/ 2. 环境要求 64位系统JDK1.8(64位)Maven 3.2.x

[笔记] 卷积03 - 运算的对称性 时域构建高通滤波器的失败尝试

1.卷积运算具备足够好的对称性 1.在计算卷积时,两个函数的位置是可以颠倒的,对吧? 在卷积运算中,确实可以对参与卷积的两个函数进行颠倒。这是因为卷积的定义是通过一个函数与另一个函数的翻转后的形式进行积分运算。具体来说&a…

【系统架构设计师】计算机组成与体系结构 ⑨ ( 磁盘管理 | “ 磁盘 “ 单缓冲区 与 双缓冲区 | “ 磁盘 “ 单缓冲区 与 双缓冲区案例 )

文章目录 一、" 磁盘 " 单缓冲区 与 双缓冲区1、" 磁盘 " 单缓冲区2、" 磁盘 " 双缓冲区 二、" 磁盘 " 单缓冲区 与 双缓冲区案例1、案例描述2、磁盘单缓冲区 - 流水线分析3、磁盘双缓冲区 - 流水线分析 一、" 磁盘 " 单缓冲…

Avalonia应用在基于Linux的国产操作deepin上运行

deepin系统介绍 deepin(原名Linux Deepin)致力于为全球用户提供美观易用,安全可靠的 Linux发行版。deepin项目于2008年发起,并在2009年发布了以 linux deepin为名称的第一个版本。2014年4月更名为 deepin,在中国常被称为“深度操作系统”。 …

matlab 干涉图仿真

目录 一、算法概述1、干涉图2、生成步骤 二、代码实现三、结果展示 本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法概述 1、干涉图 干涉图是两束或多束相干光波相遇时,它们的振…

大模型学习笔记3【大模型】LLaMA学习笔记

文章目录 学习内容LLaMALLaMA模型结构LLaMA下载和使用好用的开源项目[Chinese-Alpaca](https://github.com/ymcui/Chinese-LLaMA-Alpaca)Chinese-Alpaca使用量化评估 学习内容 完整学习LLaMA LLaMA 2023年2月,由FaceBook公开了LLaMA,包含7B&#xff0…

echarts柱状选中shadow阴影背景宽度设置

使用line,宽度增大到所需要的宽度,设置下颜色透明度就行 tooltip: {trigger: axis,//把阴影的层级往下降z:-15,axisPointer: {type: line,lineStyle: {color: rgba(150,150,150,0.3),width: 44,type: solid,},}, }, series: [{type: bar,barWidth:20,//…

探究Executors创建的线程池(如newFixedThreadPool)其核心线程数等参数的可调整性

java中提供Executors类来创建一些固定模板参数的线程池,如下图(newWorkStealingPool除外,这个是创建ForkJoinPool的,这里忽略): 拿newFixedThreadPool方法创建线程池为例,newFixedThreadPool是…

24位DAC转换的FPGA设计及将其封装成自定义IP核的方法

在vivado设计中,为了方便的使用Block Desgin进行设计,可以使用vivado软件把自己编写的代码封装成IP核,封装后的IP核和原来的代码具有相同的功能。本文以实现24位DA转换(含并串转换,使用的数模转换器为CL4660)为例,介绍VIVADO封装IP核的方法及调用方法,以及DAC转换的详细…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第54课-poplang语音编程控制机器人

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第54课-poplang语音编程控制机器人 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的…

代码随想录——柠檬水找零(Leetcode860)

题目链接 贪心 class Solution {public boolean lemonadeChange(int[] bills) {if(bills[0] 10 || bills[0] 20 || bills[1] 20){return false;}int count5 1;int count10 0;for(int i 1; i < bills.length; i){if(bills[i] 5){count5;}if(bills[i] 10){count10;…

uniapp跨域问题解决

找到menifest文件&#xff0c;在文件的最后添加如下代码&#xff1a; // h5 解决跨域问题"h5":{"devServer": {"proxy": {"/adminapi": {"target": "https://www.demo.com", // 目标访问网址"changeOrigin…

freemarker生成pdf,同时pdf插入页脚,以及数据量大时批量处理

最近公司有个需求&#xff0c;就是想根据一个模板生成一个pdf文档&#xff0c;当即我就想到了freemarker这个远古老东西&#xff0c;毕竟freemarker在模板渲染方面还是非常有优势的。 准备依赖&#xff1a; <dependency><groupId>org.springframework.boot</gr…

大华设备接入GB28181/GAT1400视频汇聚管理平台EasyCVR安防监控系统的具体操作步骤

智慧城市/视频汇聚/安防监控平台EasyCVR兼容性强&#xff0c;支持多协议接入&#xff0c;包括国标GB/T 28181协议、GA/T 1400协议、部标JT808协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等&#xff0c;并能对外分发RTMP、…

vue H5页面video 视频流自动播放, 解决ios不能自动播放问题

视频组件 <videostyle"width: 100%; height: 100%;object-fit: fill"class"player"refplayer_big_boxcontrolspreloadautoplay //自动播放muted //是否静音playsinline"true"x5-playsinline""webkit-playsinline"tru…

Vanchip新一代WiFi产品全新亮相

1‧ 研讨会介绍 随着 Wi-Fi7 时代的到来&#xff0c;高频信号衰减较高&#xff0c;因此需要外挂 FEM 电路以提高发射信号的增益&#xff0c;从而保障远距离通信的效果和范围。WiFi-FEM 逐渐成为智慧手机、路由器等终端产品中的标配芯片。Vanchip 针对客户的迫切需求&#x…