+或使用弹性搜索REST API查询

时间:2015-06-12 13:17:37

标签: elasticsearch

我们如何在弹性搜索中组合AND / OR查询。例如,以下是我们的文件

{"title": "MI2", "brand": "Xiomi","operatingSystem": "Android"},
{"title": "Nexus","brand": "Google","operatingSystem": "Android"},
{"title": "Samsung Note","brand": "Samsung","operatingSystem": "Android"},
{"title": "Samsung Galaxy","brand": "Samsung","operatingSystem": "Android"}

现在我们如何从三星或Xiomi查询Android手机。

(operatingSystem ==“Android”)AND(品牌==“三星”OR品牌==“Xiomi”)

1 个答案:

答案 0 :(得分:1)

AND / OR Logic可以用作过滤器。

elasticsearch中的过滤器将在执行查询之前进行评估,因此如果您需要将此逻辑应用于同时包含字符串查询的调用,它仍然是高效且适用的。

由于您的OR代码正在评估相同属性,在本案例中,您可以在AND语句中使用条款过滤器。您的ES电话将如下所示:

{
   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "your search string"
        }
      },
      "filter": {
        "and": [
          {
            "term": { "operatingSystem": "Android" }
          },
          {
            "terms": { "brand": ["Samsung", "Xiomi"] }
          }
        ]
      }
    }
  }
}

您可能会看到条款here的文档。默认值为布尔值OR,返回与提供的任何值匹配的文档。

要扩展您的问题,如果您希望第二部分评估不同属性上的OR语句,例如使用标题和品牌的数据结构,它将如下所示:

{
   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "your search string"
        }
      },
      "filter": {
        "and": [
          {
            "term": { "operatingSystem": "Android" }
          },
          {
            "or": [
              {
                "term": { "brand": "Xiomi" }
              },
              {
                "term": { "title": "Samsung Note" }
              }
            ]
          }
        ]
      }
    }
  }
}

后者相当于:

( operatingSystem == "Android" ) AND ( title == "Samsung Note" OR brand == "Xiomi")