2013-05-03 104 views
2

如果有人可以发布并举例说明如何做到这一点,它将回答几乎所有关于Elasticsearch过滤工作的问题。假设A,B,C,D,E等是字段,并且a1,a2,...,b1,b2等等是这些字段的可能值。还假定这些字段中的任何一个都可以有多个值。Elasticsearch复杂过滤器逻辑

A = A1和(B = B1或C = C1)和((d = D1)或(d = D2))AND(((E:

我将如何执行与下面的逻辑滤波=(e1)OR(E = e2))AND(F = f1))OR(((G = g1)AND(G = g2))AND(H = h1))

这不是一个实际的查询I我试图写,但它有我想写的所有查询。我知道如何去做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 
        ] 
       } 
       } 
      ] 
      } 
     ] 
     } 
    } 
    } 
} 

但是,我正在努力弄清楚如何组合其余的这些过滤器。

一个完整的例子会很棒!

+0

您确定要过滤吗?这个复杂的过滤器将被重复使用多次?你可以尝试生成一个query_string,就像你在搜索中显示并提交的那样,就像:'(搜索的东西)AND(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)) )' – 2013-05-03 16:36:40

+0

过滤器会更好。其中一些搜索将反复使用,是的,而其他搜索将不太常用。我主要试图了解过滤器如何以不同的方式组合,并且没有看到任何清楚说明总体结构如何工作的例子。我见过AND过滤器,OR过滤器和BOOL过滤器/查询的例子,但这些例子都不够复杂,不足以说明这些东西如何一起玩。 – CTC 2013-05-03 17:21:39

回答

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 } 
       } 
      ] 
      } 
     ] 
     } 
    } 
    } 
} 

我假设你正在构建编程这些JSONs,所以它并不难,给定一个复杂的逻辑,构建于JSON的等效滤波器。

如果问题是如何将输入文本查询转换像"A=a1 AND (B=b1 OR C=c1)"在逻辑存储相应的代表性,那么你会更好只使用一个query filterquery_string查询。你可能不想手动分析逻辑。

1

OR过滤器包含2个或更多子查询,其中必须匹配。 And过滤器包含2个或更多子查询,其中全部必须匹配。组合并嵌套它们,你会获得很多 的可能性。 (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)和(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" 
       } 
      } 
     ] 
     } 
    } 
    } 
} 

不舒尔我已经计数的paranteces正确的,但是希望你看到图片。

+0

这正是我所期待的。我仍然有点困惑,所以请耐心等待。 在你的例子中,在我看来(可能是错误的),A = a1 AND(B = b1 OR C = c1)的逻辑与用于OR(((G = g1)AND ((G = g1)AND(G = g2))AND(H = h1)) 或者换一种说法, )实际上可以用于:或(F = f1或g = g1)AND(G = g2)AND(H = h1)。 本质上,它似乎是G = g2和H = 1的子过滤器在顶层,当我真的希望他们更深一层。我错过了什么吗? – CTC 2013-05-10 16:29:54

+0

好吧,我现在可能会看到这里发生了什么。去测试一些东西,并会回发。谢谢, – CTC 2013-05-10 16:43:17