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 schemaPUT /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 ValleyPOST /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 LondonPOST /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 ValleyGET /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 booksGET /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 LanguagesGET /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.mzph.cn/news/865800.shtml

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

相关文章

relation-graph——数据组装+鼠标移入后的详情(自定义插槽的用法)——js技能提升

最近在写后台管理系统的时候,遇到一个需求,就是给我一些节点,让我渲染到页面上,效果图如下: 之前写过一篇文章关于relation-graph关系图组件http://t.csdnimg.cn/7BGYm的用法 还有一篇关于relation-graph——实现右击…

回溯算法-以单位人事管理系统为例

1.回溯算法介绍 1.来源 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤: 1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。 2 、确定易于搜…

rk3568 OpenHarmony 串口uart与电脑通讯开发案例

一、需求描述: rk3568开发板运行OpenHarmony4.0,通过开发板上的uart串口与电脑进行通讯,相互收发字符串。 二、案例展示 1、开发环境: (1)rk3568开发板 (2)系统:OpenHar…

又一个被催的相亲对象!家庭不和,是因为智慧不够?——早读(逆天打工人爬取热门微信文章解读)

你相亲过吗? 引言Python 代码第一篇 洞见 家庭不和,是因为智慧不够第二篇 口播结尾 引言 yue 昨天居然忘记了 正事:拍视频j 居然忘记了 别着急 让我找下理由(借口) 前天我妈给我介绍了个相亲对象 推给我了她的微信 我…

网络攻防——kali操作系统基本使用

1.阅读前的声明 本文章中生成的木马带有一定的攻击性,使用时请遵守网络安全相关的法律法规(恶意攻击操作系统属于违法行为)。 2.环境安装 生成木马主要需要如下工具:kali操作系统,VMware15(搭建kali操作…

Beyond Compare 解锁版下载及安装教程 (文件和文件夹比较工具)

前言 Beyond Compare 是一款功能强大的文件和文件夹比较工具。它支持文件夹比较、文件夹合并与同步、文本比较、表格比较、图片比较、16进制比较、注册表比较、版本比较等多种功能。通过 Beyond Compare,您可以轻松调查文件和文件夹之间的不同之处,并使…

【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用

系列篇章💥 No.文章1【Qwen部署实战】探索Qwen-7B-Chat:阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用4【Q…

电脑恢复技巧:如何在 Windows 10 中恢复删除的文件夹

丢失文件和文件夹是一件非常可怕的事情,尤其是当你不知情的情况下删除它们时。别撒谎。我们知道你也经历过这种情况,而且你也知道我们在说什么! 我们都曾有过这样的经历,而且大多数人很快就会再次经历。在 Windows 中&#xff0c…

从内外参推导IPM变换方程及代码实现(生成AVM环视拼接图)

一、前言 最近想实现AVM拼接,看了不少博客和论文,不过比较愚钝,一直没能很好理解原理,尤其是怎么在实现时把下文式1与式2中Z1和Z2消除的,所以严谨的推导了一下对应的公式,如有不对,水平有限&am…

Qt Group与华为合作开发OpenHarmony版本,打造无缝跨设备操作系统

在华为开发者大会2024上,跨平台软件开发和质量保证工具的领先供应商 Qt Group(Nasdaq, Helsinki: QTCOM)荣幸地宣布成为OpenHarmony生态系统合作伙伴。这是继近几年华为采用Qt开发框架和自动化测试工具Squish的商业许可后,Qt Grou…

Elasticsearch集群部署(下)

目录 上篇:Elasticsearch集群部署(上)-CSDN博客 七. Filebeat 部署 八. 部署Kafka 九. 集群测试 链接:https://pan.baidu.com/s/1AFXSmDdY5xBb7g35ipKoaw?pwdfa9m 提取码:fa9m 七. Filebeat 部署 为什么用 F…

搭建基础库~

前言 项目中会用到工具库、函数库以及一些跟框架绑定的组件,如果这些基础模块每个项目都实现一套,维护起来那真的头大,你说呢😉 搭建流程 准备工作 创建文件夹myLib、安装Git以及pnpm 目录大概就系这样子: myLib ├…

Vue跨域获取ip和ip位置城市等归属地信息

由于端口设置与查询服务器不一致,所以不能直接从ip138网上抓取,只能跨域查询。实现跨域查询,简单的方法是使用jsonp方式,只支持get请求,同时也需要查询的服务器支持jsonp。这时找到了腾讯位置服务。参考文章&#xff0…

Appium Inspector介绍和使用

一、什么是Appium Inspector 官方介绍:Overview - Appium Inspector 检查器的主要目的是提供应用程序页面源代码的检查功能。它主要用于测试自动化开发,但也可用于应用程序开发 - 或者如果只是想查看应用程序的页面源代码! 从本质上讲&…

API Object设计模式

API测试面临的问题 API测试由于编写简单,以及较高的稳定性,许多公司都以不同工具和框架维护API自动化测试。我们基于seldom框架也积累了几千条自动化用例。 •简单的用例 import seldomclass TestRequest(seldom.TestCase):def test_post_method(self…

vue3项目图片压缩+rem+自动重启等plugin使用与打包配置

一、Svg配置 每次引入一张 SVG 图片都需要写一次相对路径,并且对 SVG 图片进行压缩优化也不够方便。 vite-svg-loader插件加载SVG文件作为Vue组件,使用SVGO进行优化。 插件网站https://www.npmjs.com/package/vite-svg-loader 1. 安装 pnpm i vite-svg…

步进电机(STM32+28BYJ-48)

一、简介 步进电动机(stepping motor)把电脉冲信号变换成角位移以控制转子转动的执行机构。在自动控制装置中作为执行器。每输入一个脉冲信号,步进电动机前进一步,故又称脉冲电动机。步进电动机多用于数字式计算机的外部设备&…

DOM 中包含哪些重要方法

1. alert 带有指定消息的警告框 alert("hello world"); 2. confirm 带有确定和取消的对话框,点击确定返回 true,点击取消返回 false confirm("你好吗"); 3. prompt 显示一个提示框,允许用户输入文本,点击…

CST电磁仿真创建独特的天线

在日益无线化的世界中,一切都取决于天线,从我们用于医疗保健、工作和娱乐的智能设备到将我们从一个地方带到另一个地方的车辆。它们如此融入我们的日常生活,以至于我们大多数人甚至没有想到它们——即使想到了,我们也会想象屋顶上…

ubnutu20.04-vscode安装leetcode插件流程

1.在vscode插件商城选择安装leetcode 2.安装node.js 官网下载一个版本安装流程: ①tar -xvf node-v14.18.0-linux-x64.tar.xz ①sudo ln -s /app/software/nodejs/bin/npm /usr/local/bin/ ②ln -s /app/software/nodejs/bin/node /usr/local/bin/ 查看版本&…