SQL 查询的弹性搜索查询
Elastic search query for SQL query
我有 SQL table XYZ 数据如下:
P------ S----- R--
SAMSUNG GALAXY 1
SAMSUNG GALAXY 2
SAMSUNG GALAXY 10
SAMSUNG GALAXY 9
APPLE IOS 12
APPLE IOS 9
我有以下 SQL 查询:
select * from XYZ where P='SAMSUNG' AND S='GALAXY' AND R IN (1,2)
它 returns 匹配具有值“SAMSUNG”的 P 列和具有“GALAXY”的 S 列以及具有值 1 或 2 的 R 列的所有记录。
输出:
SAMSUNG GALAXY 1
SAMSUNG GALAXY 2
现在我正尝试为上述行为准备弹性搜索查询,但结果与预期不符:
{'query':
{'bool':
{'must': [{'match': {'P' : 'SAMSUNG'}}],
'must': [{'match': {'S' : 'GALAXY'}}],
'must': [{'match': {'R' : '1'}}, {'match': {'R' : '2'}}]
}
}
}
以上查询returns空输出。但是如果我只指定 'P' 它会起作用:
{'query':
{'bool':
{'must': [{'match': {'P' : 'APPLE'}}]}
}
}
下面这个returns输出
APPLE IOS 12
APPLE IOS 9
不确定我的第一个查询有什么问题。任何人都可以帮助如何在弹性搜索查询中使用“必须”、“应该”吗?
您需要组合使用 bool/must
个查询,以获得您的结果
must
等同于逻辑运算符 AND
,您可以使用 terms query 作为 IN
。您需要将 match 查询和 terms 查询都包装在 must
子句中,因为在您的 SQL 查询中,所有条件都使用 AND 运算符组合。
添加具有索引数据、搜索查询和搜索结果的工作示例
索引数据:
{
"P": "SAMSUNG",
"S": "GALAXY",
"R": 1
}
{
"P": "SAMSUNG",
"S": "GALAXY",
"R": 10
}
{
"P": "SAMSUNG",
"S": "GALAXY",
"R": 2
}
{
"P": "SAMSUNG",
"S": "GALAXY",
"R": 9
}
{
"P": "APPLE",
"S": "IOS",
"R": 12
}
{
"P": "APPLE",
"S": "IOS",
"R": 9
}
搜索查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"P": "SAMSUNG"
}
},
{
"match": {
"S": "GALAXY"
}
},
{
"terms": {
"R": [
1,
2
]
}
}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "67024741",
"_type": "_doc",
"_id": "1",
"_score": 1.8836654,
"_source": {
"P": "SAMSUNG",
"S": "GALAXY",
"R": 1
}
},
{
"_index": "67024741",
"_type": "_doc",
"_id": "3",
"_score": 1.8836654,
"_source": {
"P": "SAMSUNG",
"S": "GALAXY",
"R": 2
}
}
]
我有 SQL table XYZ 数据如下:
P------ S----- R--
SAMSUNG GALAXY 1
SAMSUNG GALAXY 2
SAMSUNG GALAXY 10
SAMSUNG GALAXY 9
APPLE IOS 12
APPLE IOS 9
我有以下 SQL 查询:
select * from XYZ where P='SAMSUNG' AND S='GALAXY' AND R IN (1,2)
它 returns 匹配具有值“SAMSUNG”的 P 列和具有“GALAXY”的 S 列以及具有值 1 或 2 的 R 列的所有记录。
输出:
SAMSUNG GALAXY 1
SAMSUNG GALAXY 2
现在我正尝试为上述行为准备弹性搜索查询,但结果与预期不符:
{'query':
{'bool':
{'must': [{'match': {'P' : 'SAMSUNG'}}],
'must': [{'match': {'S' : 'GALAXY'}}],
'must': [{'match': {'R' : '1'}}, {'match': {'R' : '2'}}]
}
}
}
以上查询returns空输出。但是如果我只指定 'P' 它会起作用:
{'query':
{'bool':
{'must': [{'match': {'P' : 'APPLE'}}]}
}
}
下面这个returns输出
APPLE IOS 12
APPLE IOS 9
不确定我的第一个查询有什么问题。任何人都可以帮助如何在弹性搜索查询中使用“必须”、“应该”吗?
您需要组合使用 bool/must
个查询,以获得您的结果
must
等同于逻辑运算符 AND
,您可以使用 terms query 作为 IN
。您需要将 match 查询和 terms 查询都包装在 must
子句中,因为在您的 SQL 查询中,所有条件都使用 AND 运算符组合。
添加具有索引数据、搜索查询和搜索结果的工作示例
索引数据:
{
"P": "SAMSUNG",
"S": "GALAXY",
"R": 1
}
{
"P": "SAMSUNG",
"S": "GALAXY",
"R": 10
}
{
"P": "SAMSUNG",
"S": "GALAXY",
"R": 2
}
{
"P": "SAMSUNG",
"S": "GALAXY",
"R": 9
}
{
"P": "APPLE",
"S": "IOS",
"R": 12
}
{
"P": "APPLE",
"S": "IOS",
"R": 9
}
搜索查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"P": "SAMSUNG"
}
},
{
"match": {
"S": "GALAXY"
}
},
{
"terms": {
"R": [
1,
2
]
}
}
]
}
}
}
搜索结果:
"hits": [
{
"_index": "67024741",
"_type": "_doc",
"_id": "1",
"_score": 1.8836654,
"_source": {
"P": "SAMSUNG",
"S": "GALAXY",
"R": 1
}
},
{
"_index": "67024741",
"_type": "_doc",
"_id": "3",
"_score": 1.8836654,
"_source": {
"P": "SAMSUNG",
"S": "GALAXY",
"R": 2
}
}
]