Elasticsearch(2.4)必须不过滤和数组

时间:2016-12-09 10:21:50

标签: elasticsearch filtering

我的文档中有以下数组结构:

"usages": [
    {
     "type": 1,
     "area": 207
    },
    {
     "type": 6,
     "area": 629
    },
    ...
]

如果数组中只有一个匹配项,则如何编写未返回文档的查询?

此查询将返回文档,因为“type”匹配:6

"query": {
    "bool": {
        "must_not": [
            {
                "term": {
                    "usages.type": 1
                }
            }
        ]
    }
}

如果有2个参数,查询如何:usage.type不应该是1和3。

3 个答案:

答案 0 :(得分:2)

您是否尝试过将数组描述为嵌套字段?

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/nested.html

这可能会解决您的问题。 见这个例子:

PUT /my_index 
{
}


PUT /my_index/_mapping/user
{
    "properties":
    {
        "usage":
        {
            "type": "nested"
        }
    }
}


PUT /my_index/user/1
{ 
    "usages": 
    [
        {
             "type": 1,
             "area": 207
        },
        {
            "type": 6,
            "area": 629
        }
    ]
}


GET /my_index/_search
{
    "query": {
    "bool": {
            "must_not": [
                {
                    "term": {
                        "usages.type": 1
                    }
                }
            ]
        }
    }
}

答案 1 :(得分:0)

怎么样:

"query": {
  "filtered": {
    "filter": {
      "bool": {
        "must_not": [
          "match" {
            "usages.type": 1 AND 3
          }
        ]
      }
    }
  }
}

我使用类似的东西只包括我的结果中包含某些ID的类别,这与您想要做的相反(因此使用“must_not”而不是“must”和“AND”而不是“OR”。< / p>

答案 2 :(得分:0)

默认情况下,使用数组上的must_not进行过滤。也就是说 - 当子对象未映射"type" : "nested"时。

仅当您想要关联子对象上的多个属性的值(例如:type = 1和area&gt; 50)时,才使用嵌套数据类型,如documentation中所述。

@Artholl提供了拼写错误的答案,因此嵌套映射永远不会被正确设置。这是一个有效的例子:

PUT /my_index 


PUT /my_index/user/1
{ 
    "usages": 
    [
        {
             "type": 1,
             "area": 207
        },
        {
            "type": 6,
            "area": 629
        }
    ]
}


GET /my_index/_search
{
    "query": {
        "bool": {
            "must_not": [
                {
                    "term": {
                        "usages.type": 6
                    }
                }
            ]
        }
    }
}