如何过滤Elasticsearch的结果?

274 阅读2分钟

默认情况下,Elasticsearch使用相关性分数来对搜索查询的结果进行排序。相关性分数决定了一个文档的相关程度,取决于查询的数据。

然而,我们可以应用过滤器来缩小和最大化从查询中返回的相关文档的范围。

本指南将学习如何在Elasticsearch查询中应用条件来过滤出更精确的查询结果。

通过术语过滤

我们可以使用术语查询来过滤出查询结果。例如,下面的查询可以过滤出城市名称为纽约的文档。

GET /kibana_sample_data_ecommerce/_search

{

  "query": {

    "bool": {

      "filter": [

        {"term": {

          "geoip.city_name": "New York"

        }}

      ]

    }

  }

}

在上面的查询例子中,我们使用一个布尔过滤器来搜索与city_name为 "New York "相匹配的文件。

这个例子的结果是:

多个术语

你也可以匹配符合两个或多个术语的文档。例如,我们可以查询类型=订单和地区="纽约 "的记录

GET /kibana_sample_data_ecommerce/_search

{

  "query": {

    "bool": {

      "filter": [

        {"term": {

          "type": "order"

        }},

        {

          "term": {

            "geoip.region_name": "New York"

          }

        }

      ]

    }

  }

}

在这样的例子中,type和geoip.region_name字段都必须对搜索到的术语评估为真。

结果示例:

范围过滤

要通过数值过滤,你可以使用布尔条件。例如,要过滤产品的价格大于1000的结果,我们可以这样做。

GET /kibana_sample_data_ecommerce/_search

{

  "query": {

    "bool": {

      "filter": [

        {"range": {

          "products.base_price": {

            "gte": 1000

          }

        }}

      ]

    }

  }

上述查询应该过滤项目的base_price大于或等于1000的文件。

下面是一些例子的结果:

按短语过滤

假设你只想起一个特定的短语,而不想获取索引中的所有文档?你可以使用must和match_phrase来缩小结果的范围。

例如,如果我们只想获得男装类别下的产品,但不确定所有的具体类型,怎么办?我们可以运行一个查询,如

GET /kibana_sample_data_ecommerce/_search

{

  "query": {

    "bool": {

      "must": [

        {"match_phrase": {

          "products.category": "Men's"

        }}

      ]

    }

  }

}

在上面的例子中,我们使用布尔值must来确保匹配的短语与指定的短语相符。

下面是示例结果:

必须不是过滤器

我们还可以使用must_not过滤器来删除所有包含特定短语或范围的文档。例如,要排除所有购买日期为星期一的文档,我们可以这样做。

GET /kibana_sample_data_ecommerce/_search

{

  "query": {

    "bool": {

      "must_not": [

        {"match": {

          "day_of_week": "Monday"

        }}

      ]

    }

  }

}

例子结果返回不包含day_of_week为星期一的文件。

总结

本指南讨论了使用布尔条件(如范围、必须等)过滤Elasticsearch结果的问题。