Elasticsearch复杂过滤逻辑

时间:2013-05-03 15:14:39

标签: elasticsearch

如果有人可以发布以及如何执行此操作的示例,它几乎可以回答我在Elasticsearch中如何进行过滤的问题。

假设A,B,C,D,E等是字段,并且a1,a2,...,b1,b2,...等是这些字段的可能值。还假设这些字段中的任何一个都可以有多个值。

我如何使用以下逻辑执行过滤:

A = a1 AND(B = b1 OR C = c1)AND((D = d1)OR(D = d2))AND(((E = e1)OR(E = e2))AND(F = f1 ))OR(((G = g1)AND(G = g2))AND(H = h1))

这不是我想写的实际查询,但它包含了我想写的所有查询。

我知道如何做A = a1和(B = b1或B = b2)。例如,下面我在CustomerID = 113 AND(TypeID = 91或TypeID = 70)的文档中搜索“要搜索的内容”这两个词。

{
   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "something to search"
        }
      },
      "filter": {
        "and": [
          {
            "term": {
              "CustomerID": "113"
            }
          },
          {
            "or": [
              {
                "terms": {
                  "TypeID": [
                    91,
                    70
                  ]
                }
              }
            ]
          }
        ]
      }
    }
  }
}
然而,我正在努力弄清楚如何组合这些过滤器的其余部分。

一个完整的例子真棒!

2 个答案:

答案 0 :(得分:2)

要走的路基本上就是你在片段中展示的内容。您可以嵌套方式使用AND filtersOR filters。例如,考虑:A=a1 AND (B=b1 OR C=c1)。你会:

{
   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "something to search"
        }
      },
      "filter": {
        "and": [
          {
            "term": { "A": "a1" }
          },
          {
            "or": [
              {
                "term": { "B": "b1 }
              },
              {
                "term": { "C": "c1 }
              }
            ]
          }
        ]
      }
    }
  }
}

我假设您正在以编程方式构建这些JSON,因此在给定复杂逻辑的情况下,在JSON中构造等效过滤器并不难。

如果问题是如何将输入文本查询(如"A=a1 AND (B=b1 OR C=c1)"转换为逻辑内存中的相应表示形式,那么您最好只使用{{3使用query_string查询。您可能不想手动解析逻辑。

答案 1 :(得分:1)

OR过滤器包含两个或多个子查询,其中一个必须匹配。 And过滤器包含2个或更多子查询,其中所有子查询必须匹配。结合并嵌套它们,你会得到很多 posibilities。

要完成你要求的:A = a1 AND(B = b1 OR C = c1)AND((D = d1)OR(D = d2))AND(((E = e1)OR(E = e2 ))AND(F = f1))OR(((G = g1)AND(G = g2))AND(H = h1))

{
   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "something to search"
        }
      },
      "filter": {
        "and": [
          {
            "term": {
              "A": "a1"
            }
          },
          {
            "or": [
              {
                "term": {
                  "B": "b1"
                }
              }, {
                "term": {
                  "C": "c1"
                }
              }
            ]
          },
          {
            "terms": 
              {
                "D": [ "d1", "d2" ]
              }
          },
          {
            "terms": 
              {
                "E": [ "e1", "e2" ]
              }
          },
          {
            "or": [
              {
                "term": {
                  "F": "f1"
                }
              }, {
                "term": {
                  "G": "g1"
                }
              }
            ]
          },
          {
            "term": 
              {
                "G": "g2"
              }
          },
          {
            "term": 
              {
                "H": "h1"
              }
          }
        ]
      }
    }
  }
}

不是真的,我认为这些都是正确的,但希望你能看到这张照片。