我的文档中有以下数组结构:
"usages": [
{
"type": 1,
"area": 207
},
{
"type": 6,
"area": 629
},
...
]
如果数组中只有一个匹配项,则如何编写未返回文档的查询?
此查询将返回文档,因为“type”匹配:6
"query": {
"bool": {
"must_not": [
{
"term": {
"usages.type": 1
}
}
]
}
}
如果有2个参数,查询如何:usage.type不应该是1和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
}
}
]
}
}
}