创建弹性搜索和OR查询

时间:2013-06-12 03:10:26

标签: elasticsearch

我正在尝试编写一个查询,要求“区域”为530,“开始”为06192013或“区域”为“530”,“开始”为“空白”。另外,在这两种情况中,“空间”是“顶部”或“空间2”是“底部”。这个查询似乎抓住了与这些场景相匹配的任何东西,如何更改它以使其像我想的那样工作?

{
  "size":25, 
  "from":0,
  "query": {
    "custom_filters_score": {
      "query": {
        "filtered": {
          "query": {
            "bool": {
              "must": [
                {"term":{"type":"ghost"}}, 
                {"term":{"area":"530"}}
              ]
            }
          }, 
          "filter" : {
            "or": [
              {"terms":{"space": ["top"]}}, 
              {"terms":{"space2":["bottom"]}}, 
              {
                "and": [
                  {"term":{"area":"530"}}, 
                  {"term":{"start":"06192013"}}
                ]
              }, 
              {
                "and": [
                  {"term":{"area":"530"}}, 
                  {"term":{"starts":"blank"}}
                ]
              }
            ]
          }
        }
      }, 
      "filters": [
        {"filter":{"term":{"filter1":5743}}, "boost":"1000"}, 
        {"filter":{"term":{"filter2":4451}}, "boost":"64"}, 
        {"filter":{"term":{"filter3":["tech"]}}, "boost":"16"}, 
        {"filter":{"terms":{"filter4":[]}}, "boost":"8"}, 
        {"filter":{"terms":{"filter5":[]}}, "boost":"5"}, 
        {"filter":{"term":{"access":"1"}}, "boost":"2"}
      ], 
      "score_mode":"total"
    }
  }
}

1 个答案:

答案 0 :(得分:1)

你快到了!试试这个:

...
"query" : { "match_all":{} },
"filter" : {
    "and": [
        {
            "or": [
                {"term":{"space": "top"}}, 
                {"term":{"space2":"bottom"}}
            ]
        },
        {
            "and": [
                 {"term":{"area":"530"}}, 
                 {
                     "or": [
                         {"term":{"start":"06192013"}},
                         {"term":{"starts":"blank"}}
                     ]
                 }
            ]
        }
    ]
}
...

除非你需要得分(看起来不像),否则你应该使用过滤器完成所有这些操作,但是由于这个原因,它们不能计算得分并且速度更快。

"query" : { "match_all":{} }最终会让所有与过滤器匹配相同分数的文档。

注意:我还将您的terms查询与一个元素的数组转换为term查询...