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
        }
      }
    ]