gpt4 book ai didi

sql - Elasticsearch -如何使用AND查询一对多表联接

转载 作者:行者123 更新时间:2023-12-03 02:32:13 26 4
gpt4 key购买 nike

我是 Elasticsearch 的新手。我是否可以通过 Elasticsearch 实现以下查询?如果是这样,查询字符串应该是什么样?

输入:类似sql的句子。句子是:“(A和B)以及(C和D)”

A,B,C,D是字段比较。例如,A->字段“职员名称”的值等于“约翰”。

例如,有2个表。员工表和任务表。

员工表

员工姓名:约翰

员工姓名:玛丽

任务表

TaskName:JohnTaskA,StaffName:John

TaskName:JohnTaskB,StaffName:John

TaskName:MaryTaskA,StaffName:Mary

因此,在传统DB中,John可以以一对多关系链接到JohnTaskA和JohnTaskB。

我对查询行为(A和B)以及(C和D)的预期行为如下:

在(A和B)查询之后,假定仅返回一个记录。约翰-> JohnTaskA

(C和D)查询后,假定仅返回一条记录。约翰-> JohnTaskB

然后,以下查询
(A和B)和(C和D)
不应返回任何值,因为“John-> JohnTaskA”实际上与“John-> JohnTaskB”不匹配。

相反,如果(C和D)查询,则仅返回一条记录,如John-> JohnTaskB

然后下面的查询
(A和B)和(C和D)
可以把约翰的唱片还回来。

但是我无法通过 Elasticsearch 查询实现这种预期行为。在我的第一次尝试中,我使用nestedQuery处理任务表的查询,并且可以成功地在嵌套表中实现多列检查。

例如,如果A-> Task.TaskName = JohnTaskA,B-> Task.StaffName = John,则A和B可以返回一条记录。

但是,如果A-> Task.TaskName = JohnTaskA,B-> Task.StaffName = Mary,则A和B无法返回任何记录。

但是我发现在这种情况下

(A和B)和(C和D)

我无法使用中间的“和”将两个嵌套的查询结果链接在一起。它不会返回预期的行为。

如果无法更改SQL语句,我可以知道 Elasticsearch 如何实现此查询吗?还是我需要使用其他方式,例如亲子关系?

在此先感谢您的帮助!

对于(A AND B)AND(C AND D),

(A和B)返回id = c1的子记录。

(C AND D)返回id = c2的子记录。

即使它们共享相同的父记录(例如,父记录id = p1),由于c1!= c2,如果通过SQL查询,则(A AND B)AND(C AND D)不返回任何记录,但是使用 Elasticsearch ,它仍然返回记录p1。

最佳答案

我想以说 Elasticsearch 不是RDMS作为开头,您不应该这样使用它。在Elasticsearch中,对数据进行非规范化要好得多(查询性能,复制性能,写入性能等)。

话虽如此,由于您有特定的查询需求,因此应该预先定义索引映射,以便可以维护对象之间的关系。为此,可以在映射中使用nested属性类型或(作为最后的手段)join属性类型。

您可能要考虑的示例映射在一个可能称为staff_tasks的索引中:

PUT staff_tasks
{
"mappings": {
"properties": {
"task": {
"type": "nested",
"properties": {
"name": {
"type": "text",
},
"staff": {
"type": "object",
"properties": {
"name": {
"type": "text"
}
}
}
}
}
}
}
}

然后,您将可以使用REST API对此进行查询。例如,使用匹配查询:
GET staff_tasks/_search
{
"query": {
"match": {
"staff.name": "john"
}
}
}

该查询将返回所有 staff_tasks,其名称为“john”(不区分大小写),并且在同一响应中包含“相关”任务信息。

另外,如果您更喜欢使用sql,则可以使用 sql restful endpoint:
POST _sql
{
"query": "SELECT * FROM staff_tasks WHERE task.staff.name = 'john'"
}

关于sql - Elasticsearch -如何使用AND查询一对多表联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59678081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com