SQL 语句的弹性搜索 DSL 语法等价
Elastic search DSL Syntax equivalence for SQL statement
我正在尝试在弹性搜索查询中复制以下查询逻辑,但有些地方不对。
基本上 returns 一个文档下面的查询。我想要应用第一个条件:"name": "iphone"
或 更复杂的第二个条件:(username = 'gogadget' AND status_type = '1' AND created_time between 4532564 AND 64323238)
。请注意,should 中的 nested bool must 会处理更复杂的情况。如果我将 "name": "iphone"
的外部匹配更改为 "name": "wrong value"
,我仍然应该看到 1 个文档。但是当我这样做时我什么也得不到。我不确定这是哪里错了。
SQL 查询在下方。
SELECT * from data_points
WHERE name = 'iphone'
OR
(username = 'gogadget' AND status_type = '1' AND created_time between 4532564 AND 64323238)
{
"size": 30,
"query": {
"bool": {
"must": [
{
"bool": {
"minimum_should_match": "1",
"should": [
{
"bool": {
"must": [
{
"match": {
"username": "gogadget"
}
},
{
"terms": {
"status_type": [
"3",
"4"
]
}
},
{
"range": {
"created_time": {
"gte": 20140712,
"lte": 1405134711
}
}
}
]
}
}
],
"must": [],
"must_not": []
}
},
{
"match": {
"name": "iphone"
}
}
]
}
}
}
should
查询将匹配查询和return.
您不需要使用 must
来汇总您的 OR query
。
查询应该是这样的:
{
"query": {
"bool": {
"should": [{
"bool": {
"must": [{
"match": {
"username": "gogadget"
}
}, {
"terms": {
"status_type": [
"3",
"4"
]
}
}, {
"range": {
"created_time": {
"gte": 20140712,
"lte": 1405134711
}
}
}]
}
}, {
"match": {
"name": "iphone"
}
}]
}
}
}
我正在尝试在弹性搜索查询中复制以下查询逻辑,但有些地方不对。
基本上 returns 一个文档下面的查询。我想要应用第一个条件:"name": "iphone"
或 更复杂的第二个条件:(username = 'gogadget' AND status_type = '1' AND created_time between 4532564 AND 64323238)
。请注意,should 中的 nested bool must 会处理更复杂的情况。如果我将 "name": "iphone"
的外部匹配更改为 "name": "wrong value"
,我仍然应该看到 1 个文档。但是当我这样做时我什么也得不到。我不确定这是哪里错了。
SQL 查询在下方。
SELECT * from data_points
WHERE name = 'iphone'
OR
(username = 'gogadget' AND status_type = '1' AND created_time between 4532564 AND 64323238)
{
"size": 30,
"query": {
"bool": {
"must": [
{
"bool": {
"minimum_should_match": "1",
"should": [
{
"bool": {
"must": [
{
"match": {
"username": "gogadget"
}
},
{
"terms": {
"status_type": [
"3",
"4"
]
}
},
{
"range": {
"created_time": {
"gte": 20140712,
"lte": 1405134711
}
}
}
]
}
}
],
"must": [],
"must_not": []
}
},
{
"match": {
"name": "iphone"
}
}
]
}
}
}
should
查询将匹配查询和return.
您不需要使用 must
来汇总您的 OR query
。
查询应该是这样的:
{
"query": {
"bool": {
"should": [{
"bool": {
"must": [{
"match": {
"username": "gogadget"
}
}, {
"terms": {
"status_type": [
"3",
"4"
]
}
}, {
"range": {
"created_time": {
"gte": 20140712,
"lte": 1405134711
}
}
}]
}
}, {
"match": {
"name": "iphone"
}
}]
}
}
}