elasticsearch布尔搜索语法

时间:2015-08-20 15:38:41

标签: elasticsearch

任何人都可以解释为什么这个elasticsearch语法不正确。我很难理解基本的语法

这有效

"query": {
    "filtered": {
        "filter": {
           "bool" : {
               "should": {
                   "terms": {
                       "headline":["aut"]
                   }                        
               },
               "must": {
                    "range": {
                        "date_at" : {
                           "gt": "1900-01-01 00:00:00",
                           "lt": "1980-01-01 00:00:00"
                        }
                    }                       
               }
           }
        }
    }
}

但是,此查询不起作用

"query": {
    "filtered": {
        "filter": {
           "bool" : {
               "should": {
                   "terms": {
                       "headline":["aut"]
                   }                        
               },
               "must": {
                    "range": {
                        "date_at" : {
                           "gt": "1900-01-01 00:00:00",
                           "lt": "1980-01-01 00:00:00"
                        }
                    },
                    "term": {
                        "headline": "et" 
                    }
               }
           }
        }
    }
}

在布尔“必须”中添加“term”子句会导致语法错误,所有碎片都被破坏等等......问题似乎是我想在两个不同的bool中使用相同的索引两次

标题必须包含“foo”

标题应该包含“bar”

有可能吗?

1 个答案:

答案 0 :(得分:1)

你试过这个吗?

{
   "query": {
      "filtered": {
         "filter": {
            "bool": {
               "should": [
                  {
                     "terms": {
                        "headline": [
                           "aut"
                        ]
                     }
                  }
               ],
               "must": [
                  {
                     "range": {
                        "date_at": {
                           "gt": "1900-01-01 00:00:00",
                           "lt": "1980-01-01 00:00:00"
                        }
                     }
                  },
                  {
                     "term": {
                        "headline": "et"
                     }
                  }
               ]
            }
         }
      }
   }
}

这可能是你想要做的直接解释,但这可能是你真正需要的:

{
   "query": {
      "filtered": {
         "filter": {
            "bool": {
               "must": [
                  {
                     "range": {
                        "date_at": {
                           "gt": "1900-01-01 00:00:00",
                           "lt": "1980-01-01 00:00:00"
                        }
                     }
                  },
                  {
                     "term": {
                        "headline": "et"
                     }
                  }
               ]
            }
         }
      }
   }
}

以下是我用来玩它的一些代码:

http://sense.qbox.io/gist/ea16ff321397c2187ef503541019d52c564b7460