使用 Elasticsearch 搜索 Mysql 表

2024-03-10

假设我有以下“费用”MySQL 表:

id amount vendor tag
1 100 google foo
2 450 GitHub bar
3 22 GitLab fizz
4 75 AWS buzz

我正在构建一个 API,该 API 应根据部分“供应商”或“标签”过滤器返回费用,因此供应商 =“Git”应返回记录 2 和 3,标签 =“zz”应返回记录 3 和 4。 我正在考虑利用elasticsearch 功能,但我不确定正确的方法..
我读过的大多数文章都建议将表记录(使用logstash管道或其他方法)复制到弹性索引。

那么我的 API 甚至不查询数据库并直接从 ES 返回文档数组?

这被认为是好的做法吗?将整个表复制到弹性表中? 表关系怎么样...如果我想按嵌套表关系过滤怎么办?...


所以我的 API 甚至不查询数据库并返回文档数组 直接来自ES?

是的,当您对 Elasticsearch 进行查询时,您只会从 Elasticsearch 获得结果。另一种方法是,从 Elasticsearch 获取 id 并使用 id 从 MySQL 检索文档,但这可能会影响响应时间。

这被认为是好的做法吗?将整个表复制到 松紧带?那么表关系呢...如果我想过滤的话怎么办 嵌套表关系?...

这不是关于好的实践或坏的实践,而是关于您想要实现什么类型的功能和用例,以及基于该技术堆栈可以使用并且可以复制数据。有很多公司使用 Elasticsearch 作为secondary他们拥有重复数据的数据源只是因为他们的用例最适合 Elasticsearch 或其他 NoSQL 数据库。

Elasticsearch 是 NoSQL DB,它不维护数据之间的任何关系。因此,您需要在索引到 Elasticsearch 之前对数据进行标准化。你可以阅读this https://spoon-elastic.com/all-elastic-search-post/simple-elastic-usage/denormalize-index-elasticsearch/文章了解有关数据标准化以及为什么需要它的更多信息。

ElasticSearch提供Nested https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html and Join https://www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html父子关系的数据类型,但两者都有一些限制和性能影响。

以下是他们提到的内容join字段类型:

连接字段不应该像关系数据库中的连接那样使用。在 Elasticsearch 良好性能的关键是对数据进行非规范化 到文档中。每个连接字段,has_child or has_parent查询添加了一个 对您的查询性能产生重大影响。还可以触发全局 要构建的序数。

以下是他们提到的内容nested字段类型:

当摄取具有大量任意键集的键值对时, 您可以考虑将每个键值对建模为其自己的嵌套 文档与key and value字段。相反,请考虑使用flattened数据类型,它将整个对象映射为单个字段,并且 允许对其内容进行简单搜索。嵌套文档和 查询通常很昂贵,因此使用flattened数据类型为 这个用例是一个更好的选择。

我读过的大多数文章建议复制表记录(使用 Logstash 管道或其他方法)到弹性索引。

是的,您可以使用logstash或任何语言客户端喜欢java, python等,将数据从 DB 同步到 Elasticsearch。你可以检查this https://stackoverflow.com/a/37309866/5489276所以回答有关此的更多信息。

您的搜索要求

如果您继续使用 Elasticsearch 那么您可以使用N-Gram 分词器 https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html or 正则表达式查询 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html并达到您的搜索要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Elasticsearch 搜索 Mysql 表 的相关文章

  • 显示不同表中的名称而不是 ID

    我有 2 张桌子 Category带主键ID和列Name Employee带主键ID和列Category id Note Category id现在显示ID正确地 我想展示Name代替ID对于输出Employee Attempt categ
  • 查找返回的 mysql 结果中的行数(nodejs)

    当使用 felixge 的 mysql for node js 时 如何向结果对象询问返回的行数 我有一个相当昂贵的查询 所以我不想运行COUNT 首先 只是为了第二次运行查询 如果是选择查询 则只需获取返回数组的长度即可 connecti
  • 如何提高MySQL INSERT和UPDATE性能?

    我们数据库中的 INSERT 和 UPDATE 语句的性能似乎正在下降 并导致我们的 Web 应用程序性能不佳 表是InnoDB 应用程序使用事务 我可以做一些简单的调整来加快速度吗 我认为我们可能会遇到一些锁定问题 我怎样才能找到答案 你
  • 将数据插入多个表 PHP MySQL

    我有一个用于存储食谱的基本数据结构 它由三个表组成 如下所示 表 1 食谱 recipe id recipe name 表 2 成分 成分 ID 成分名称 表 3 配方 成分 配方 id 成分 id 我在添加新配方时遇到问题 想知道插入的最
  • 可能的 PDOException 错误(MySQL 5)?

    因此 我正在为我的网络应用程序设置一个安装程序 并具有数据库凭据的输入字段 我的验证过程的一部分包括测试数据库连接 使用 PHP 的 PDO 库 如果连接失败 我希望能够区分错误的密码 错误的地址 不存在的数据库名称等 以便我可以引用表单上
  • 如何在 WHERE 子句中最佳地使用 COALESCE() ?

    这是我的查询 select coalesce qa2 subject qa subject as question subject qa body select count from viewed items vi where coales
  • 将数组写入文件的最佳方法? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想避免写入数据库并使用常量 数组作为 lang 文件等 i e lang array hello gt hello world 并能够从后台编
  • 数据库镜像/Postgres流复制

    我不是 DBA 我是基于企业数据库的应用程序的主要开发人员 我目前正在指定一些新机器来升级我们现有的企业数据库 目前 我们在 DR 站点上运行带有数据库的 Postgres 8 4 该数据库通过前员工执行的一些自定义 rsync 工作定期接
  • 选择特定值之后的项目

    说这是我的sql SELECT title author ISBN FROM bs books ORDER BY ISBN LIMIT 3 它只是从某个表中选择所有内容 标题 作者等 假设我想选择某个标题后面的所有项目 而不是按字母顺序或其
  • 如何使用 django-haystack 和 elasticsearch 后端进行模糊搜索?

    看起来好像elasticsearch支持模糊查询 http www elasticsearch org guide reference query dsl fuzzy query http www elasticsearch org gui
  • PHP-MySQL 或 MySQLi 中哪个最快?

    我想知道是否有人对这种二分法有任何第一手经验 一些博客说 mysql 扩展比 mysqli 更快 这是真的 我只是问速度 我知道 mysqli 具有旧扩展中不存在的功能 在我看到的大多数基准测试中 MySQL 扩展比 MySQLi 稍快一些
  • 未捕获的类型错误:$.ajax 不是函数

    我正在制作一个带有排行榜表的小型游戏项目 我正在尝试使用 jQuery ajax 和 PHP 从 mysql 数据库获取排行榜以显示 但它给了我一条错误消息 我的语法看起来不错 所以我不确定问题是什么 leader btn click fu
  • 如何在java中执行复合sql查询?

    如何执行以下查询并通过准备好的语句检索结果 INSERT INTO vcVisitors sid VALUES SELECT LAST INSERT ID 有没有办法同时执行这两个语句 我尝试执行以下操作 Connection con Db
  • 如何编写Elasticsearch多个必须脚本查询?

    我想使用查询来比较多个字段 我有字段 1 到 4 我想搜索字段 1 大于字段 2 的数据 并且下面的查询工作正常 size 0 source field1 field2 field3 field4 sort query bool filte
  • 将附加数据获取到 django 表单下拉选择中

    我有一个具有外键的操作模型 它指定操作重复发生的频率 class Reoccurance models Model label models CharField Label max length 50 unique True days mo
  • ElasticSearch 嵌套查询 - 排除父文档

    尝试排除其中子文档之一与查询不匹配的顶级文档 对于下面的示例 我尝试排除其嵌套作业之一具有的所有文档current true 并与company name Elastic 但由于嵌套作业文档之一与current false和公司name E
  • C# Elasticsearch NEST 无法转换 lambda 表达式

    我遇到了与此处描述的完全相同的问题 但未得到解答 ElasticSearch NEST 搜索 https stackoverflow com questions 24615676 elasticsearch nest search I us
  • MySQL 将前导数字添加到列中的现有 ID

    我有一个名为country id的mysql数据库列 例如 country id 1 2 59 435 2714 我现在想要完成的是将前导零添加到每个 ID 因此结果将是 country id 0001 0002 0059 0435 271
  • MySQL 中两个 Select 查询的结果相减

    我编写了两个 mysql 查询 一个获取一年中特定月份的总用户 注册 另一个获取一年中特定月份的活跃用户 我需要找到数量inactive当年的用户 为此 我正在考虑减去通过两个单独的查询获得的总用户数和活动用户列 以下是查询 1 Fetch
  • 如何在不更改设置的情况下不区分大小写排序

    我的索引名称是 data new 下面是插入索引的代码 test id 1 name A professor Bill Cage accounting id 2 name AB professor Gregg Payne engineeri

随机推荐