使用 Elasticsearch 搜索 Mysql table
searching Mysql table with Elasticsearch
假设我有以下“费用”MySQL Table:
id
amount
vendor
tag
1
100
google
foo
2
450
GitHub
bar
3
22
GitLab
fizz
4
75
AWS
buzz
我正在构建一个 API 应该 return 费用基于部分“供应商”或“标签”过滤器,所以 vendor="Git" 应该 return记录2&3,tag="zz"应该return记录3&4。
我正在考虑利用 elasticsearch 功能,但我不确定正确的方法..
我阅读的大多数文章都建议将 table 记录(使用 logstash 管道或其他方法)复制到弹性索引。
所以我的 API 甚至不直接从 ES 查询数据库和 return 文档数组?
这被认为是好的做法吗?将整个 table 复制到弹性?
table 关系怎么样...如果我想按嵌套 table 关系过滤怎么办?...
So my API doesn't even query the DB and return an array of documents
directly from ES?
是的,当您对 elasticsearch 进行查询时,您只会从 Elasticsearch 获得结果。另一种方法是,只需从 Elasticsearch 获取 id 并使用 id 从 MySQL 检索文档,但这可能会影响响应时间。
Is this considered good practice? replicating the whole table to
elastic? What about table relations... What If I want to filter by
nested table relation?...
这不是关于好的做法或坏的做法,而是关于您想要实现什么类型的功能和用例,以及基于该技术堆栈可以使用和数据可以复制。有很多公司使用 Elasticsearch 作为 secondary
数据源,他们有重复的数据只是因为用例最适合 Elasticsearch 或其他 NoSQL 数据库。
Elasticsearch 是 NoSQL DB,它不维护数据之间的任何关系。因此,您需要在索引到 Elasticsearch 之前对数据进行非规范化。您可以阅读 this 文章,了解更多关于反规范化及其必要性的信息。
ElasticSearch 为父子关系提供 Nested and Join 数据类型,但两者都有一些限制和性能影响。
下面是他们提到的 join
字段类型:
The join field shouldn’t be used like joins in a relation database. In
Elasticsearch the key to good performance is to de-normalize your data
into documents. Each join field, has_child
or has_parent
query adds a
significant tax to your query performance. It can also trigger global
ordinals to be built.
下面是他们提到的 nested
字段类型:
When ingesting key-value pairs with a large, arbitrary set of keys,
you might consider modeling each key-value pair as its own nested
document with key
and value
fields. Instead, consider using the
flattened
data type, which maps an entire object as a single field and
allows for simple searches over its contents. Nested documents and
queries are typically expensive, so using the flattened
data type for
this use case is a better option.
most articles I read suggest replicating the table records (using
logstash pipe or other methods) to elastic index.
是的,您可以使用 logstash
或任何语言客户端,如 java
、python
等,将数据从数据库同步到 Elasticsearch。您可以查看 SO answer 以获取更多相关信息。
您的搜索要求
如果您继续使用 Elasticsearch,那么您可以使用 N-Gram Tokenizer or Regex Query 并实现您的搜索要求。
假设我有以下“费用”MySQL Table:
id | amount | vendor | tag |
---|---|---|---|
1 | 100 | foo | |
2 | 450 | GitHub | bar |
3 | 22 | GitLab | fizz |
4 | 75 | AWS | buzz |
我正在构建一个 API 应该 return 费用基于部分“供应商”或“标签”过滤器,所以 vendor="Git" 应该 return记录2&3,tag="zz"应该return记录3&4。
我正在考虑利用 elasticsearch 功能,但我不确定正确的方法..
我阅读的大多数文章都建议将 table 记录(使用 logstash 管道或其他方法)复制到弹性索引。
所以我的 API 甚至不直接从 ES 查询数据库和 return 文档数组?
这被认为是好的做法吗?将整个 table 复制到弹性? table 关系怎么样...如果我想按嵌套 table 关系过滤怎么办?...
So my API doesn't even query the DB and return an array of documents directly from ES?
是的,当您对 elasticsearch 进行查询时,您只会从 Elasticsearch 获得结果。另一种方法是,只需从 Elasticsearch 获取 id 并使用 id 从 MySQL 检索文档,但这可能会影响响应时间。
Is this considered good practice? replicating the whole table to elastic? What about table relations... What If I want to filter by nested table relation?...
这不是关于好的做法或坏的做法,而是关于您想要实现什么类型的功能和用例,以及基于该技术堆栈可以使用和数据可以复制。有很多公司使用 Elasticsearch 作为 secondary
数据源,他们有重复的数据只是因为用例最适合 Elasticsearch 或其他 NoSQL 数据库。
Elasticsearch 是 NoSQL DB,它不维护数据之间的任何关系。因此,您需要在索引到 Elasticsearch 之前对数据进行非规范化。您可以阅读 this 文章,了解更多关于反规范化及其必要性的信息。
ElasticSearch 为父子关系提供 Nested and Join 数据类型,但两者都有一些限制和性能影响。
下面是他们提到的 join
字段类型:
The join field shouldn’t be used like joins in a relation database. In Elasticsearch the key to good performance is to de-normalize your data into documents. Each join field,
has_child
orhas_parent
query adds a significant tax to your query performance. It can also trigger global ordinals to be built.
下面是他们提到的 nested
字段类型:
When ingesting key-value pairs with a large, arbitrary set of keys, you might consider modeling each key-value pair as its own nested document with
key
andvalue
fields. Instead, consider using theflattened
data type, which maps an entire object as a single field and allows for simple searches over its contents. Nested documents and queries are typically expensive, so using theflattened
data type for this use case is a better option.
most articles I read suggest replicating the table records (using logstash pipe or other methods) to elastic index.
是的,您可以使用 logstash
或任何语言客户端,如 java
、python
等,将数据从数据库同步到 Elasticsearch。您可以查看
您的搜索要求
如果您继续使用 Elasticsearch,那么您可以使用 N-Gram Tokenizer or Regex Query 并实现您的搜索要求。