📜  在 elasticsearch 中添加 where 子句 (1)

📅  最后修改于: 2023-12-03 14:50:54.763000             🧑  作者: Mango

在 Elasticsearch 中添加 Where 子句

Elasticsearch 是一个开源的分布式全文检索引擎,提供了强大的搜索和分析功能。其中,查询语句是 Elasticsearch 中最基础和核心的部分。本文将介绍如何在 Elasticsearch 中使用 WHERE 子句(类似 SQL 中的 WHERE)进行查询过滤。

基础语法

在 Elasticsearch 中,查询语句使用 JSON 格式进行描述。WHERE 子句的基本语法如下:

{
  "query": {
    "bool": {
      "must": [
          // 其他查询条件
      ],
      "filter": [
          // WHERE 子句的过滤条件
      ]
    }
  }
}

其中,filter 段是我们添加 WHERE 子句的部分,可以包含多个过滤条件。

过滤条件

Elasticsearch 提供了多种过滤条件,这里只列举一些常用的:

等于条件

过滤字段的值等于某个具体值。

{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "field_name": "field_value"
        }
      }
    }
  }
}
区间条件

过滤字段的值在某个区间范围内。

{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "field_name": {
            "gte": "lower_bound",
            "lte": "upper_bound"
          }
        }
      }
    }
  }
}
存在条件

过滤字段存在,不为 NULL 或空字符串。

{
  "query": {
    "bool": {
      "filter": {
        "exists": {
          "field": "field_name"
        }
      }
    }
  }
}
逻辑与、或、非

多个过滤条件可以通过逻辑运算符组合。

  • 逻辑与
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "field1": "value1"
              }
            },
            {
              "range": {
                "field2": {
                  "gte": "lower_bound",
                  "lte": "upper_bound"
                }
              }
            }
          ]
        }
      }
    }
  }
}
  • 逻辑或
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "should": [
            {
              "term": {
                "field1": "value1"
              }
            },
            {
              "range": {
                "field2": {
                  "gte": "lower_bound",
                  "lte": "upper_bound"
                }
              }
            }
          ]
        }
      }
    }
  }
}
  • 逻辑非
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must_not": {
            "term": {
              "field1": "value1"
            }
          }
        }
      }
    }
  }
}
完整示例

下面是一个完整的示例,使用了多个 WHERE 子句组合进行过滤。请将其中的 index_namefield_name 替换为你的索引名和字段名。

{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": [
        {
          "term": {
            "field1": "value1"
          }
        },
        {
          "range": {
            "field2": {
              "gte": "lower_bound",
              "lte": "upper_bound"
            }
          }
        },
        {
          "exists": {
            "field": "field3"
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "field4": "value2"
                }
              },
              {
                "term": {
                  "field5": "value3"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must_not": {
              "range": {
                "field6": {
                  "gte": "lower_bound",
                  "lte": "upper_bound"
                }
              }
            }
          }
        }
      ]
    }
  }
}

这个示例中,“筛选 field1 等于 value1 并且 field2 在区间 [lower_bound, upper_bound] 之间并且 field3 存在并且 field4 等于 value2 或 field5 等于 value3 并且 field6 不在区间 [lower_bound, upper_bound] 之间”的文档。