【问题标题】:Inner join in elastic search on one to many relationship一对多关系的内连接弹性搜索
【发布时间】:2017-05-15 07:15:19
【问题描述】:

我有两个具有以下结构的文档

ITEM
{
     ITEM_ID(primary Key),
     ITEM_NAME,
     ITEM_DESCRIPTION
}
ITEMREGULATION
{
     ITEMREGULATION_ID,
     ITEM_ID(Foreign Key),
     ITEMREGULATION_TYPE
}

这些表是一对多的关系,例如 [ITEM] -----* [ITEMREGULATION]。 现在我想对这些数据执行以下 sql 查询 -

select * from ITEM inner join ITEMREGULATION on ITEM.ITEM_ID = ITEMREGULATION.ITEM_ID。

我在弹性搜索中尝试过嵌套关系,但 ITEMREGULATION 引用了 ITEM,所以它进入无限循环并给出异常 - java.lang.StackOverflowError: null

如何在elasticsearch中获取上面的sql查询?

【问题讨论】:

  • 您可以粘贴您的查询吗?

标签: sql elasticsearch


【解决方案1】:

您的问题有两个解决方案。

  1. ITEM.ITEM_IDITEMREGULATION.ITEM_ID 可以是不同的类型,你可以比较 int whit string。

  2. 正确的 SQL 问题是

select * from ITEM inner join ITEMREGULATION on ITEM.ITEM_ID = ITEMREGULATION.ITEM_ID.

【讨论】:

    【解决方案2】:

    最佳做法始终是尽可能非正规您的数据。
    如果不是,您应该为您的ITEMREGULATION 定义一个_parent 字段。在elasticsearch中定义了父子关系提示后,可以使用has_parenthas_child查询来模拟elasticsearch中的joins

    【讨论】:

    • 我在我的 java 应用程序中开发它,我使用 ITEM id 作为 - @Field(type = FieldType.String, index = FieldIndex.not_analyzed, store = true) private Long id;和 ITEMREGULATION 项目 id 为 @ManyToOne @JoinColumn(name = "item_id") @Field(type = FieldType.String, index = FieldIndex.analyzed, analyzer = "lowercase_keyword", store = true) @Parent(type = "parent")私人物品物品;它给出错误 - java.lang.IllegalArgumentException: Parent ID property should be String
    • ParentID 是索引时间参数,(可能)无法在映射注释中定义。在将文档添加到弹性时设置父 ID,它应该与 parrent type 中文档的 _id 字段匹配
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2019-02-11
    • 1970-01-01
    • 2018-11-28
    • 2019-02-12
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多