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

news2024/11/16 10:37:52

作者:来自 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

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

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

相关文章

Cartoon UI(游戏卡通UI图标界面按钮框架)

卡通UI是一套完整的艺术UI组件,图标,按钮,将非常适合你的游戏项目。 所有组件都是高质量的,在专业水平上实现,并具有透明的背景,因此您可以将其放置在任何需要的表面上。 卡通UI包括: -按钮&…

VIO(Virtual_Input_Output) IP 使用笔记

VIO(Virtual Input/Output)IP 核,即虚拟输入输出 IP,可以通过调试界面模拟 IO 的变化,这可以在板子没有按键等外设、或外设不足的情况下,来模拟外部输入。然而网上关于 VIO 的教程都说的不是很清楚&#xf…

如何学习大型语言模型中的量化

前言 图片来自作者:Flow 展示了量化的必要性。(笑脸和生气脸图片来自Yan Krukau) 在我解释上面的图表之前,让我先介绍一下您将在本文中学习的重点内容。 首先,您将了解量化是什么以及为什么量化。接下来,您将深入了解…

sssssssssssssssshare_ptrrrrrrrrrrrrrrrrrrrrrrrrr

智能指针——shared_ptr的原理及仿写 shared_ptr的原理及仿写 共享指针允许多个指针指向同一份数据,因为它使用了引用计数,每多一个指针指向这个数据,引用技术加一,每销毁一个指针,引用技术减一,如果引用计…

【 2024!深入了解 大语言模型(LLM)微调方法(总结)】

引言 众所周知,大语言模型(LLM)正在飞速发展,各行业都有了自己的大模型。其中,大模型微调技术在此过程中起到了非常关键的作用,它提升了模型的生成效率和适应性,使其能够在多样化的应用场景中发挥更大的价值。 那么&…

助力企业数字化转型:无锡哲讯——您的专业SAP系统运维服务商

数字化时代,企业对SAP系统的依赖程度日益加深,而SAP系统的稳定运行对于企业的核心业务至关重要。 无锡哲讯作为专业的SAP运维服务商,致力于为客户提供全面的SAP运维解决方案,助力企业实现数字化转型,提升核心竞争力。 …

再次登榜,深兰科技荣膺全球独角兽企业500强

6月27~28日,《2024全球独角兽企业500强》榜单发布,深兰科技凭借在AI产业赋能和产品出海方面的出色表现,继2023年之后再次登榜。 《2024全球独角兽企业500强》评委会介绍,本届榜单的产生,是由“全球独角兽企…

logback log.info耗时异常,RollingFileAppender+TimeBasedRollingPolicy配置踩坑

我喜欢把核心内容放开头 此次log.info耗时异常升高,是由于日志量过大(5G甚至以上),并且使用同步阻塞的RollingFileAppenderTimeBasedRollingPolicy,导致log.info一直等待日志文件滚动,造成了异常。解决方式…

ETCD概述--使用/特性/架构/原理

ETCD概述 ETCD是一个高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据(高可用, 强一致性)​全局的配置服务中心. 本文将介绍其特性、相关操作和常见的应用场景. 如果想了解更多, 请查阅我的技术博客: https://dingyuqi.com 特性 …

专访ATFX首席战略官Drew Niv:以科技创新引领企业高速发展

在金融科技创新的浪潮中,人才是推动企业高速发展的核心驱动力,优质服务是引领企业急速前行的灯塔。作为差价合约领域的知名品牌,ATFX高度重视人才引进工作,秉持“聚天下英才而用之”的理念,在全球范围内广揽科技精英&a…

某业帮六月校招后端笔试

题目一 解题思路 签到题,dp就行。 题目二 解题思路 这个比较烦人,需要处理额外的引号和括号。用DFS,对于每个间隙,插入与不插入都搜一遍。 题目三 解题思路: 双指针,左右各一个指针,对比长度&…

变频器配置V20

变频器控制最好是变频电机,在速度不低的情况下工频电机 改变电机转速,调节扭矩, 变频器 L1 L2 L3 ,R S T 电机输入 uvw 电机输出 FSD 制动电阻 设置步骤 恢复出厂设置 p0010:30 p0970:21p0003:3(设定访问级别) P0003 用户访问级别 0 - 4 1…

沟通方法和技巧

0 Preface/Foreword 1 沟通对象 沟通维度: upward,向上沟通,直接上级downward,向下沟通,直接下级horizontal,横向沟通,同部门/跨部门同事 2 沟通方式(5W2H) 对于开会和…

css样式flex布局之,盒子垂直居中

<div class"item"><img src"../../assets/images!code_app.png" alt"" /><div>5555</div><p>微信扫一扫关注</p><p>“快速预约挂号”</p></div>.item{display: flex;flex-direction: col…

两个令人兴奋的 PostgreSQL 特性可改善 NULL 处理#PG认证

唯一列中的 NULL 值永久链接 一个众所周知但令人讨厌的怪异值NULL是NULL ! NULL&#xff0c;因此一UNIQUE列仍然可以有多个NULL值。 #PG培训#PG考试#postgresql培训#postgresql考试#postgresql认证 &#xff08;为了简单起见&#xff0c;示例使用数字 id 列&#xff0c;但我…

DevExpress WPF中文教程:Grid - 如何显示摘要(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

chrome 谷歌浏览器插件打包

1、找到id对应的字符串去搜索 C:\Users\<你的用户名>\AppData\Local\Google\Chrome\User Data\Default\Extensions2、选择根目录 直接加载下面的路径扩展可用&#xff1a;

liteide教程-运行平台和3264位

【1】编译后的运行平台选择&#xff08;linux/windows&#xff09; 1&#xff09;点击"查看"&#xff0c;选择"编辑当前环境" 2)GOOS参数修改 GOOSlinux //表示linux系统 GOOSwindows //表示Windows系统 【2】编译后的是32位还是64位程序 1&#x…

Word文档中公式的常用操作

一、参考资料 二、常用操作 插入公式 Alt 多行公式 Shift Enter 多行公式对齐 WORD Tips: 多行公式编辑及对齐 word自带公式等号对齐&#xff08;可任意符号处对齐&#xff09; 多行公式按照 为基准对齐。 拖动鼠标选中整个公式点击右键&#xff0c;选择【对齐点(…

使用表单系统快速搭建邀请和签到系统

在组织活动时&#xff0c;邀请和签到环节往往是活动成败的关键之一。传统的纸质邀请和签到方式不仅费时费力&#xff0c;还容易出现各种问题&#xff0c;例如名单遗漏、签到混乱等。而使用TDuckX“搭建邀请和签到系统”将彻底改变这一现状&#xff0c;为活动组织者提供了一种高…