gpt4 book ai didi

sql - ES6:通过AND运算符将子查询连接到两个不同的行

转载 作者:行者123 更新时间:2023-12-03 01:38:46 25 4
gpt4 key购买 nike

我有以下索引:

+-----+-----+-------+
| oid | tag | value |
+-----+-----+-------+
| 1 | t1 | aaa |
| 1 | t2 | bbb |
| 2 | t1 | aaa |
| 2 | t2 | ddd |
| 2 | t3 | eee |
+-----+-----+-------+

其中: oid -对象ID, 标记-属性名称, -属性值。

对应:
"mappings": {
"document": {
"_all": { "enabled": false },
"properties": {
"oid": { "type": "integer" },
"tag": { "type": "text" }
"value": { "type": "text" },
}
}
}

这种简单的结构允许存储任意数量的对象属性,并且使用“或”逻辑运算符按一个或多个属性进行搜索非常简单。
例如。获取对象oid的位置:
(tag='t1' AND value='aaa') OR (tag='t2' AND value='ddd')

ES查询:
{
"_source": { "includes":["oid"] },
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{ "term": { "tag": "t1" } },
{ "term": { "value": "aaa" } }
]
}
},
{
"bool": {
"must": [
{ "term": { "tag": "t2" } },
{ "term": { "value": "ddd" } }
]
}
}
],
"minimum_should_match": "1"
}
}
}

但是,使用AND逻辑运算符很难按两个或多个属性进行搜索。因此,问题是如何通过AND运算符将两个子查询连接到两个不同的记录。例如。获取对象oid的位置:
(tag='t1' AND value='aaa') AND (tag='t2' AND value='ddd')

在这种情况下,结果必须为:{“oid”:“2”}

在这种情况下,搜索包含在两个不同记录中的数据并应用MUST而不是上一个示例中的SHOULD。

我在SQL中有两个等效的选项:
SELECT i1.[oid]
FROM [index] i1 INNER JOIN [index] i2 ON i1.oid = i2.oid
WHERE
(i1.tag='t1' AND i1.value='aaa')
AND
(i2.tag='t2' AND i2.value='ddd')

---------

SELECT [oid] FROM [index] WHERE tag='t1' AND value='aaa'
INTERSECT
SELECT [oid] FROM [index] WHERE tag='t2' AND value='ddd'

不能同时执行两个请求并在客户端上合并它们。

Elastic Search版本为6.1.1

最佳答案

为了实现所需的功能,您需要使用嵌套类型,即您的映射应如下所示:

PUT my-index
{
"mappings": {
"doc": {
"properties": {
"oid": {
"type": "keyword"
},
"data": {
"type": "nested",
"properties": {
"tag": {
"type": "keyword"
},
"value": {
"type": "text"
}
}
}
}
}
}
}

这些文档将像这样被索引:
PUT /my-index/doc/_bulk
{ "index": {"_id": 1}}
{ "oid": 1, "data": [ {"tag": "t1", "value": "aaa"}, {"tag": "t2", "value": "bbb"}] }
{ "index": {"_id": 2}}
{ "oid": 2, "data": [ {"tag": "t1", "value": "aaa"}, {"tag": "t2", "value": "ddd"}, {"tag": "t3", "value": "eee"}] }

然后,您可以使查询像这样工作:
POST my-index/_search
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "data",
"query": {
"bool": {
"filter": [
{
"term": {
"data.tag": "t1"
}
},
{
"term": {
"data.value": "aaa"
}
}
]
}
}
}
},
{
"nested": {
"path": "data",
"query": {
"bool": {
"filter": [
{
"term": {
"data.tag": "t2"
}
},
{
"term": {
"data.value": "ddd"
}
}
]
}
}
}
}
]
}
}
}

关于sql - ES6:通过AND运算符将子查询连接到两个不同的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49814486/

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