视情况而定。
有时,在 Elasticsearch 中镜像您的数据库表是有意义的。例如,如果您希望用户能够自己搜索营养素列表和自己的产品列表,最好有两个 Elasticsearch 索引。
但是,听起来您想要的,并且在 Elasticsearch 世界中更常见的是,在索引到 Elasticsearch 时将来自不同表的数据组合起来。由于全文搜索的工作方式,您经常希望denormalize 您的数据。非规范化通常是关系数据库领域的反模式,但通常是 Elasticsearch 的最佳实践。
举个例子,如果您希望用户能够搜索含有各种营养成分的产品,您可能希望像这样索引您的产品文档:
#change host to reflect your Elasticsearch server
curl -XPUT 'http://localhost:9200/products/_doc/1' -d '{
"name": "Banana",
"nutrients": ["potassium", "vitamin C", "copper"]
}'
curl -XPUT 'http://localhost:9200/products/_doc/2' -d '{
"name": "Rice",
"nutrients": ["manganese", "copper"]
}'
curl -XPUT 'http://localhost:9200/products/_doc/3' -d '{
"name": "Orange",
"nutrients": ["Vitamin C", "Thiamin"]
}'
请原谅我在营养信息方面的拙劣尝试
如您所见,营养成分的名称经常重复。但是,这种方法可以让您使用 Elasticsearch 的全文搜索功能来查找具有所需营养的任何项目。
您可能希望在 Elasticsearch 中为您的产品重复使用关系数据库中的 ID(或将它们存储在另一个字段中),以便您可以返回数据的“源”以获取更多信息。