elasticsearch - ElasticSearch如何与一个嵌套查询

标签 elasticsearch

我试图弄清楚如何对我的Elastic Search查询进行AND。我尝试了几种不同的变体,但始终遇到解析器错误。

我所拥有的是这样的结构:

{
  "title": "my title",
  "details": [
    { "name": "one", "value": 100 },
    { "name": "two", "value": 21 }
  ]
}

我已将details定义为映射中的嵌套类型。我想要实现的是一个查询,它与标题的一部分匹配,并且通过明细的namevalue匹配各种明细。

我有以下查询,使我几乎可以到达那里,但我无法弄清楚如何对细节进行AND。作为示例,我想查找具有以下特征的任何东西:
  • 的详细信息值小于或等于的一个 100
  • AND值小于或等于的两个的详细信息25

  • 以下查询仅允许我按一个详细名称/值进行搜索:
    "query" : {
      "bool": {
        "must": [
          { "match": {"title": {"query": titleQuery, "operator": "and" } } },
          {
            "nested": {
              "path": "details",
              "query": {
                "bool": {
                  "must": [
                    { "match": {"details.name" : "one"} },
                    { "range": {"details.value" : { "lte": 100 } } }
                  ]
                }
              }
            } // nested
          }
        ] // must
      }
    }
    

    第二个问题是,查询标题然后将查询的嵌套部分移到过滤器中会更好吗?

    最佳答案

    你好亲密!只需在您的外部"nested"中添加另一个"must"子句:

    POST /test_index/_search
    {
       "query": {
          "bool": {
             "must": [
                {
                   "match": {
                      "title": {
                         "query": "title",
                         "operator": "and"
                      }
                   }
                },
                {
                   "nested": {
                      "path": "details",
                      "query": {
                         "bool": {
                            "must": [
                               {"match": {"details.name": "one" } },
                               { "range": { "details.value": { "lte": 100 } } }
                            ]
                         }
                      }
                   }
                },
                {
                   "nested": {
                      "path": "details",
                      "query": {
                         "bool": {
                            "must": [
                               {"match": {"details.name": "two" } },
                               { "range": { "details.value": { "lte": 25 } } }
                            ]
                         }
                      }
                   }
                }
             ]
          }
       }
    }
    

    这是一些我用来测试的代码:

    http://sense.qbox.io/gist/1fc30d49a810d22e85fa68d781114c2865a7c92e

    编辑:哦,第二个问题的答案是"is",尽管如果您使用的是2.0,则问题为changed a little

    关于elasticsearch - ElasticSearch如何与一个嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33623456/

    相关文章:

    autocomplete - Elasticsearch自动完成其余的词

    c# - 如何在 lambda 表达式中使用数组?

    elasticsearch - 嵌套聚合Elasticsearch

    search - 如何在 ElasticSearch 中索引和存储多种语言

    autocomplete - Elasticsearch 自动完成或按 token 自动建议

    elasticsearch - Elasticsearch match_phrase + fuzziness

    elasticsearch - 无法启动Kafka-Connect

    Ubuntu 15.10 elasticsearch 2.3 无法连接到本地主机端口 9200 : Connection refused

    elasticsearch - Confluent 5.4.0 ElasticSearch Sink连接器中没有连接器类型错误

    elasticsearch - ElasticSearch无法返回超过10,000偏移量的数据,不允许进行索引级别更改。无法使用Scroll API