如果有人可以发布以及如何执行此操作的示例,它几乎可以回答我在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
]
}
}
]
}
]
}
}
}
}
然而,我正在努力弄清楚如何组合这些过滤器的其余部分。
一个完整的例子真棒!
答案 0 :(得分:2)
要走的路基本上就是你在片段中展示的内容。您可以嵌套方式使用AND filters和OR 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"
}
}
]
}
}
}
}
不是真的,我认为这些都是正确的,但希望你能看到这张照片。