当前位置: 首页 > 面试题库 >

如何在Elasticsearch中或在Lucene级别加入

祖浩淼
2023-03-14
问题内容

在Elasticsearch中进行等效于SQL连接的最佳方法是什么?

我有一个带有两个大表的SQL安装程序:Persons和Items。一个人可以拥有 许多
物品。人员和项目行都可以更改(即更新)。我必须运行按人员和项目方面进行筛选的搜索。

在Elasticsearch中,您似乎可以使Person成为Item的嵌套文档,然后使用has_child

但是:如果您随后更新一个Person,我认为您需要更新他们拥有的每个Item(可能很多)。

那是对的吗?在Elasticsearch中有解决此查询的好方法吗?


问题答案:

正如已经提到的,要走的路是父母/孩子。关键是嵌套文档的性能非常好,但是要对其进行更新,您需要重新提交整个结构(父+嵌套文档)。尽管嵌套文档的内部实现由单独的Lucene文档组成,但是这些嵌套文档不可见,也不能直接访问。实际上,在使用嵌套文档时,您需要使用适当的查询来访问它们(嵌套查询,嵌套过滤器,嵌套构面等)。

另一方面,父/子允许您具有相互引用的单独文档,这些文档可以独立更新。就性能和使用的内存而言,它是有代价的,但是它比嵌套文档更加灵活。

但是,如本文所述,elasticsearch可帮助您管理关系这一事实并不意味着您必须使用这些功能。在许多复杂的用例中,最好在应用程序层上具有一些处理关系的定义逻辑。在方面方面,父母/子女也有局限性:例如,您永远无法同时取回父母和子女,而嵌套文档不允许只取回匹配的子女(目前)。



 类似资料:
  • 问题内容: 我有三个食物类型索引:“意大利”,“西班牙”,“美国”。当用户搜索“奶酪”时,“意大利”文档似乎出现在顶部。如果我偏爱说“西班牙语”,是否可以“增强”结果?(我仍然应该获得意大利语的结果,但是基于索引类型“ Spanish”的一些数值提升值,结果中返回的文档的顺序将优先使用“ Spanish”索引。在用户输入的lucene和/或ES查询? 问题答案: 添加带有字词查询或字段(或两者都有

  • 我正在尝试制作一个DnD字符生成器,部分原因是我需要一个可以通过其他方法编辑的统计列表,所以我试图在类级别添加它。我目前的代码是: 但是当我试图运行它时,我在每个“添加”行都有一个“预期标识符”错误。

  • 问题内容: 哪种风格更好? 风格A: 风格B: 假设 在代码的其他地方没有使用,仅在此函数内部使用。 问题答案: 确实,如前所述,通常最好遵循PEP 8的建议,并在顶部进行导入。虽然有一些例外。理解它们的关键在于您在第二段中嵌入的问题:“导入在哪个阶段发生?” 导入实际上是一个可执行语句。导入模块时,模块中的所有可执行语句都会运行。“ def”也是可执行的语句;它的执行将使定义的名称与(已编译的)

  • 问题内容: 说说我有一些小树而不是文档,我需要将它们存储在Lucene索引中。我该怎么做呢? 树中的一个示例节点: 在上面的节点中,“数据”成员变量是用空格分隔的字符串,因此需要全文搜索。“类型”成员变量只是一个单词。 搜索查询本身将是一棵树,并将搜索每个节点中的数据和类型,以及树的结构以查找匹配项。在与子节点匹配之前,查询必须首先与父节点数据和类型匹配。可以对数据值进行近似匹配。 索引此类数据的

  • 问题内容: 我知道ElasticSearch是基于Apache Lucene构建的,但是我想知道两者之间的显着差异。 问题答案: Lucene是一个 Java库 。您可以将其包含在项目中,并使用函数调用来引用其功能。 Elasticsearch是一个 JSON 基于, 分布式 , 网络服务器 建在Lucene的。尽管是Lucene在做下面的实际工作,但是Elasticsearch为我们提供了一个在

  • 问题内容: 我正在尝试做这样的事情。但是我收到一个未知的列错误: 基本上,我只想使用别名,这样就不需要执行之前执行的操作。在mysql中这可能吗? 问题答案: 考虑使用子查询,例如: