【问题标题】:Elastic Search URI Search Filtering弹性搜索 URI 搜索过滤
【发布时间】:2019-09-20 23:08:15
【问题描述】:

我有一个movies ES 索引,其映射如下:

{
  "doc": {
    "properties": {
       "director": {
          "type": "text"
       },
       "genres": {
          "type": "text",
          "index": "false"
       },
       "title": {
          "type": "text"
       },
       "year": {
          "type": "long"
       }
    }
  }
}

对于流派,我将提交一个字符串数组。现在,我想允许我的客户针对我的端点提交一个查询,在那里我将 q 请求参数代理到 ES 客户端。

但我正在努力使用 URI 搜索过滤数据,就像通过提交查询作为针对我的索引的有效负载来实现的一样。例如:

GET movies/doc/_search
{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            { 
              "term": {
                "genres": "War"
              }
            }
          ],

          "must": [
            { 
              "term": {
                "genres": "Foo"
              }
            }
          ],

          "must": [
            { 
              "term": {
                "genres": "Bar"
              }
            }
          ]
        }
      }
    }
  }
}

是否可以通过 URI 搜索来实现?如果有,怎么做?

【问题讨论】:

  • 为什么要使用 URI 搜索?有什么具体原因吗?
  • 坦率地说,在 Get 上提交有效载荷不是很 Rest-y,如果有办法避免它,我会走那条路
  • 此外,我们正在构建一个基于任务的 UI,其中 UI 将针对由 ES 后端支持的 API 发出请求。因此,对于前端工程师来说,构建这样的查询将花费太多精力。而且我不想暴露很多 ES 的复杂性
  • 您可以根据客户端请求在后端构建 DSL 查询。 URI 搜索不支持 DSL 查询的所有功能。
  • 这是一个好点。但我希望有人确认这是实现这一目标的唯一方法。

标签: elasticsearch


【解决方案1】:

来自 ES 文档

您可以使用查询参数直接定义您的搜索条件 在请求 URI 中,而不是在请求正文中。请求 URI 搜索不支持完整的 Elasticsearch Query DSL,但 方便测试。

根据我们的讨论,我建议您在收到客户端的请求后在后端构建一个 DSL 查询。您需要公开一个 API,它将以结构化格式 (JSON) 将 UI 输入发送到后端,这可以帮助您轻松构建 DSL 查询。

【讨论】:

    【解决方案2】:

    这是我最终的做法,没有q 参数。 6.0.1 版:

    POST http://127.0.0.1:9200/movies/_mapping/doc
    {
      "doc": {
        "properties": {
           "director": {
              "type": "text"
           },
           "title": {
              "type": "text"
           },
           "year": {
              "type": "long"
           },
            "genres": {
              "type": "keyword"
           }
        }
      }
    }
    

    创建文档:

    POST http://127.0.0.1:9200/movies/doc/
    {
        "title": "title 1",
        "director": "Igor M",
        "year": 2011,
        "genres": ["Bar", "Foo"]
    }
    

    文档查询:

    GET http://127.0.0.1:9200/movies/_search
    
    {
      "query": {
        "bool": {
            "must":[
           { "match": { "genres": "War" }},
           { "match": { "genres": "Bar" }}
          ]
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多