2

如果有人可以发布如何执行此操作的示例,它几乎可以回答我关于 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 OR TypeID=70) 的文档中搜索术语“要搜索的内容”。

{
   "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "something to search"
        }
      },
      "filter": {
        "and": [
          {
            "term": {
              "CustomerID": "113"
            }
          },
          {
            "or": [
              {
                "terms": {
                  "TypeID": [
                    91,
                    70
                  ]
                }
              }
            ]
          }
        ]
      }
    }
  }
}

然而,我正在努力弄清楚如何组合这些过滤器的其余部分。

一个完整的例子会很棒!

4

2 回答 2

2

要走的路基本上就是您在代码段中显示的内容。您将以嵌套方式使用AND 过滤器OR 过滤器。例如,考虑: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)"的相应表示,那么最好只使用带有查询的查询过滤器query_string。您可能不想手动解析逻辑。

于 2013-05-03T23:59:46.673 回答
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)) 或 (((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"
              }
          }
        ]
      }
    }
  }
}

不确定我是否正确计算了paranteces,但希望你能看到图片。

于 2013-05-04T10:46:36.977 回答