如何在Elasticsearch的术语中使用OR?

时间:2018-10-15 07:23:47

标签: elasticsearch

我是Elasticsearch的新手,我需要在查询中添加OR条件的帮助。我目前有这个查询。

{
  :query=>{
    :bool=>{
      :must=>[{
        :query_string=>{
          :default_operator=>"AND", 
          :query=>"*"
        }
      }]
    }
  }, 
  :filter=>{
    :and=>[{
      :term=>{
        :partner_id=>26
      }
    }, 
    {:term=>{
      :is_unpublished=>"false"}
    }]
  }
}

目前,它当前接受26,但是如果我有2个值怎么办?例如。 26和36,如何在OR条件下添加36

如果这是SQL,它将是这样的:

SELECT * FROM table WHERE (partner_id = 26 OR partner_id = 36) AND is_unpublished = false

我尝试了以下方法,但是没有运气:

{:term => {:partner_id => 36}, :or => [:term => {:partner_id => 26}]}

这也没有运气:

{:term => {:or =>[{:partner_id => 26},{:partner_id => 36}]}}

3 个答案:

答案 0 :(得分:1)

使用“应该”吗?

 "should" : [
    { "term" : { "tag" : "wow" } },
    { "term" : { "tag" : "elasticsearch" } }
  ]

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

答案 1 :(得分:1)

should视为OR运算符,并用query bool映射包装:

{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "company" : "stackoverflow" }
      },
      "filter": {
        "term" : { "parner.is_published" : 1 }
      },
      "should" : [
        { "term" : { "partner.age" : 26 } },
        { "term" : { "partner.age" : 36 } }
      ],
      "minimum_should_match" : 1
    }
  }
}

minimum_should_match是关键,它是您希望Elasticsearch匹配的OR中有多少条件。

此外,这也不是解决方案的一部分,但我认为与您有关,如果您仍在考虑使用SQL方式,请查看ES SQL style

答案 2 :(得分:0)

您还可以使用以下代码。

 "should" : [
    { "term" : {
                 "fields": ["tag"],
                 "query: "wow OR elasticsearch" 
              } 
    }
  ]