当前位置: 首页 > 面试题库 >

包含异或的嵌套过滤器查询

田骁
2023-03-14
问题内容

我无法将结果集限制为同时满足以下两个选项的范围kol_tags.scored.namekol_tags.scored.score范围的文档or

我想匹配具有kol_tags.scored.name“ Core
Grower”且kol_tags.scored.score介于1到100之间的文档,除非它们也具有kol_tags.scored.name
Connectivity” kol_tags.scored.score不在 35到65之间)。

给定以下映射(为简洁起见,省略了非嵌套字段):

GET /production_users/user/_mapping
{
  "user": {
    "_all": {
      "enabled": false
    },
    "properties": {
      "kol_tags": {
        "type": "nested",
        "properties": {
          "scored": {
            "type": "nested",
            "properties": {                  
              "name": {
                "type": "string",
                "index": "not_analyzed",
                "omit_norms": true,
                "index_options": "docs"
              },
              "score": {
                "type": "integer"
              }
            }
          }
        }
      }
    }
  }
}

我正在执行以下查询:

{
  "filter": {
    "nested": {
      "path": "kol_tags.scored",
      "filter": {
        "or": [
          {
            "and": [                  
              {
                "terms": {
                  "kol_tags.scored.name": [
                    "Core Grower"
                  ]
                }
              },
              {
                "range": {
                  "kol_tags.scored.score": {
                    "gte": 1,
                    "lte": 100
                  }
                }
              }
            ]
          },
          {
            "and": [                  
              {
                "terms": {
                  "kol_tags.scored.name": [
                    "Connectivity"
                  ]
                }
              },
              {
                "range": {
                  "kol_tags.scored.score": {
                    "gte": 35,
                    "lte": 65
                  }
                }
              }
            ]
          }
        ]
      }
    }
  }
}

通过上面的查询,我得到了与kol_tags.scored.name“ Core Grower”
匹配且kol_tags.scored.score在1到100之间且还具有“ Connectivity”且在任意范围内的 ALSO的
文档。kol_tags.scored.name``kol_tags.scored.score

我需要的是符合条件的文件

  • kol_tags.scored.name的“核心种植者”,kol_tags.scored.score介于1到100之间
  • kol_tags.scored.name的“连通性”以及kol_tags.scored.score介于35和65之间
  • 排除任何具有kol_tags.scored.name“连通性”且kol_tags.scored.score小于34且大于66的文档

问题答案:

您的描述含糊不清,但我尝试制作一个可运行的示例,该示例应在此处运行:https
:
//www.found.no/play/gist/8940202(也嵌入在下面)

这是我做的几件事:

  • 将过滤器放入filtered-query中。仅当您要过滤匹配时才使用顶层filterpost_filter在Elasticsearch 1.0中重命名),而不要过滤方面。

  • 使用bool代替andor,因为过滤器是可缓存的。此处更多信息:http : //www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

  • 而最重要的,把nested 里面bool,所以逻辑得到正确的WRT。嵌套文档与父文档应该匹配什么。

  • must_not为您的最后一点添加了一个帐户。不知道您是否可以拥有两个名为name的子文档"Connectivity",但是如果可以的话,应该可以解决这个问题。如果您只有一个,可以删除must_not

您没有提供任何示例文档,所以我提出了一些我认为适合您的描述的文档。我认为您不需要两个级别的嵌套。

#!/bin/bash

export ELASTICSEARCH_ENDPOINT="http://localhost:9200"

# Create indexes

curl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{
    "mappings": {
        "type": {
            "properties": {
                "kol_tags": {
                    "properties": {
                        "scored": {
                            "type": "nested",
                            "properties": {
                                "name": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}'

# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"play","_type":"type"}}
{"kol_tags":{"scored":[{"name":"Core Grower","score":36},{"name":"Connectivity","score":42}]}}
{"index":{"_index":"play","_type":"type"}}
{"kol_tags":{"scored":[{"name":"Connectivity","score":34},{"name":"Connectivity","score":42}]}}
{"index":{"_index":"play","_type":"type"}}
{"kol_tags":{"scored":[{"name":"Core Grower","score":36}]}}
{"index":{"_index":"play","_type":"type"}}
{"kol_tags":{"scored":[{"name":"Connectivity","score":36}]}}
'

# Do searches

curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "should": [
                        {
                            "nested": {
                                "path": "kol_tags.scored",
                                "filter": {
                                    "bool": {
                                        "must": [
                                            {
                                                "term": {
                                                    "name": "Core Grower"
                                                }
                                            },
                                            {
                                                "range": {
                                                    "score": {
                                                        "gte": 1,
                                                        "lte": 100
                                                    }
                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        },
                        {
                            "nested": {
                                "path": "kol_tags.scored",
                                "filter": {
                                    "bool": {
                                        "must": [
                                            {
                                                "term": {
                                                    "name": "Connectivity"
                                                }
                                            },
                                            {
                                                "range": {
                                                    "score": {
                                                        "gte": 35,
                                                        "lte": 65
                                                    }
                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    ],
                    "must_not": [
                        {
                            "nested": {
                                "path": "kol_tags.scored",
                                "filter": {
                                    "bool": {
                                        "must": [
                                            {
                                                "term": {
                                                    "name": "Connectivity"
                                                }
                                            },
                                            {
                                                "not": {
                                                    "range": {
                                                        "score": {
                                                            "gte": 35,
                                                            "lte": 65
                                                        }
                                                    }
                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}
'

curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "filter": {
        "nested": {
            "path": "kol_tags.scored",
            "filter": {
                "or": [
                    {
                        "and": [
                            {
                                "terms": {
                                    "kol_tags.scored.name": [
                                        "Core Grower"
                                    ]
                                }
                            },
                            {
                                "range": {
                                    "kol_tags.scored.score": {
                                        "gte": 1,
                                        "lte": 100
                                    }
                                }
                            }
                        ]
                    },
                    {
                        "and": [
                            {
                                "terms": {
                                    "kol_tags.scored.name": [
                                        "Connectivity"
                                    ]
                                }
                            },
                            {
                                "range": {
                                    "kol_tags.scored.score": {
                                        "gte": 35,
                                        "lte": 65
                                    }
                                }
                            }
                        ]
                    }
                ]
            }
        }
    }
}
'


 类似资料:
  • 问题内容: 我有一个对象映射,它以类似标签的方式使用嵌套对象(在我们的示例中)。每个标签可以属于一个客户/用户,并且当我们要允许我们的用户针对生成样式搜索时。 问题是,当我们运行查询时,如果一个对象有多个道具,并且当其他道具不返回时,如果多个道具之一与过滤器匹配,则当我们想要相反时- 如果一个道具返回false,则不返回vs。如果返回true,则返回true。 我在这里发布了一个完整的示例:htt

  • 问题内容: 嘿,我想知道是否有人知道使用正则表达式或通配符(或SQL中的pehaps )的方式,以便可以使用JSONPath在大量JSON数据内进行搜索。 例如(是的,我正在解析,而不是在应用程序中读取数据): 我希望能够浏览这样的数据: 其中参数的内容是数据对中部分或全部值的一部分。 目前,我只找到文件上,,,和关系运算符,它不给我那么多的灵活性。 有谁知道一个方法可以让我只是 刚刚 JSONP

  • 问题内容: 使用嵌套对象的布尔运算符时遇到一些麻烦。这是我的映射: 我想获取恰好包含两个指定ip甚至更多的文档。 假设我的文档具有以下ips: 我想通过使用此过滤器进行搜索来仅检索DOC 1: 问题在于,同时检索了DOC 1和DOC2。 问题答案: 你可以使用你的条件过滤器是这样的: 这是我用来测试的一些代码: http://sense.qbox.io/gist/d6b5f4e4c0d2977a0

  • 我有多个嵌套文档doc。嵌套查询工作正常,但它们仍然会返回所有嵌套对象(即整个文档),即使搜索查询只匹配少数嵌套对象。但是,它确实将文档作为一个整体进行过滤。 下面是一个例子: 当在地址中搜索时,理想情况下,我应该只获得带有一个嵌套对象的,但我会获得所有嵌套对象。如何筛选返回的嵌套对象? 示例查询: 该查询的输出是和所有员工,而我只想要。

  • 问题内容: 我有带有嵌套字段的文档,如下所示: 嵌套字段的映射如下所示: 在切换到elasticsearch 2之前,我有一个带有aggs的查询,该查询计算了没有结果的文档。这是查询的聚合部分: 现在我切换到elasticserach 2,它只计算所有文档。我已经尝试过其他操作,例如计算所有文档和计算结果,以便可以减去结果,但是 总是0 如何正确过滤/计数嵌套字段? 问题答案: 如果您要计算产生结

  • 你知道我做错了什么吗?下面是我的ORM映射: