组合和/或弹性搜索

时间:2016-09-03 07:36:59

标签: elasticsearch

如何在elasticsearch

中编写以下条件的查询
Select * from table1 where (cnd1 or cond2) and (cnd3)

我的cond2值来自嵌套对象。我的json对象在

之下
details={ "name"="name1",
      "address":"{
      "city":"city1"
      }"
      }

我需要从上面的对象中取出城市

details.address.city

上面的语法是否正确,如果不是如何获得第二个对象城市的价值。

2 个答案:

答案 0 :(得分:0)

    {
        "bool" : {
            "must" : cond3,
            "should" : [
                cond1,
                cond2
            ],
            "minimum_should_match" : 1
        }

}

通过此链接获取更多信息https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-bool-query.html

答案 1 :(得分:0)

您可以使用Elasticsearch轻松创建条件查询。但是你的数据部分有一些奇怪的情况。

details={ "name"="name1",
      "address":"{
      "city":"city1"
      }"
      }

Elasticsearh将您的数据保存为json对象,但您应该将数据作为json提供。在本节中,有一个对象,您尝试发送。让我们来看看:

详细对象有一个name属性,它是一个字符串。并且还有一个地址属性,它也是一个字符串。如果您想通过details.address.city到达此对象,它应该是一个必须包含城市属性的对象。现在我们尝试修复:

{
  "id":...,
  ...
  "details": {
    "name": "name1",
    "address": {
      "city": "city1"
    }
  }
}

在这种情况下,我删除了细节对象的双引号。现在,您可以将json的city属性作为json对象。现在,我们创建一个到达城市的查询:

{
  "query": {
    "bool": {
      "must": {
        "term": {
          "your-json-attribute": "???"
        }
      },
      "should": [
        {
          "term": {
            "your-json-attribute": "???"
          }
        },
        {
          "term": {
            "your-json-attribute": "???"
          }
        }
      ]
    }
  }
}

我使用term查询,但还有很多其他查询类型。您可以在文档上查看它们。但对于AndOr,您可以使用bool查询。查看https://www.elastic.co/guide/en/elasticsearch/reference/2.0/query-dsl-bool-query.html