我有一个对象映射,它props
以类似标签的方式使用嵌套对象(在我们的示例中)。每个标签可以属于一个客户/用户,并且当我们要允许我们的用户针对生成query_string
样式搜索时props.name
。
问题是,当我们运行查询时,如果一个对象有多个道具,并且当其他道具不返回时,如果多个道具之一与过滤器匹配,则当我们想要相反时-
如果一个道具返回false,则不返回vs。如果返回true,则返回true。
我在这里发布了一个完整的示例:https :
//gist.html" target="_blank">github.com/d2kagw/1c9d4ef486b7a2450d95
提前致谢。
我相信在这里您可能需要一个扁平化的值列表的优势,例如值数组。数组和嵌套对象之间的主要区别在于,后者“知道”嵌套属性的哪个值对应于 同一
嵌套对象中另一个属性的另一个值。另一方面,值数组将使某个属性的值变平,并且您将失去a client_id
和a 之间的“关联”
name
。含义是,您拥有props.client_id = [null, 2]
和的数组props.name = ["petlover", "premiumshopper"]
。
使用nested
过滤器,您希望将该字符串与所有值匹配,以props.name
表示一个父文档的 所有
嵌套props.name
s都需要匹配。嗯,嵌套对象不会发生这种情况,因为嵌套文档是分开的,并且要分别查询。并且,如果至少一个嵌套文档匹配,则将其视为匹配。
换句话说,对于像"query": "props.name:(carlover NOT petlover)"
您这样的查询,基本上需要像数组一样针对扁平化的值列表运行它。您需要针对[“ carlover”,“ petlover”]运行查询。
我对您的建议是制作嵌套文档"include_in_parent": true
(即在父级中保留一个扁平的,类似数组的值列表)并稍微更改一下查询:
query_string
零件,请使用扁平化的属性方法来匹配您查询的元素组合列表,而不是逐个元素。match
(或term
参见下文),missing
零件使用嵌套属性方法,因为您可以null
在其中使用。一个missing
阵列上只会匹配,如果整个阵列丢失,而不是在它的一个值,所以在这里我们不能使用相同的方法作为查询,那里的值在数组中夷为平地。query
match
整数,我将使用term
,因为它不是字符串而是整数,并且默认为not_analyzed
。说了这些,有了以上更改,这些更改就是:
{
"mappings" : {
...
"props": {
"type": "nested",
"include_in_parent": true,
...
应该(并且确实)返回零结果
GET /nesting-test/_search?pretty=true
{
“query”: {
“filtered”: {
“filter”: {
“and”: [
{
“query”: {
“query_string”: { “query”: “props.name:((carlover AND premiumshopper) NOT petlover)” }
}
},
{
“nested”: {
“path”: “props”,
“filter”: {
“or”: [ { “query”: { “match”: { “props.client_id”: 1 } } }, { “missing”: { “field”: “props.client_id” } } ]
}
}
}
]
}
}
}
}
应该(并且确实)只返回1
GET /nesting-test/_search?pretty=true
{
“query”: {
“filtered”: {
“filter”: {
“and”: [
{“query”: {“query_string”: { “query”: “props.name:(carlover NOT petlover)” } } },
{
“nested”: {
“path”: “props”,
“filter”: {
“or”: [{ “query”: { “match”: { “props.client_id”: 1 } } },{ “missing”: { “field”: “props.client_id” } } ]
}
}
}
]
}
}
}
}
应该(并且确实)只返回2
GET /nesting-test/_search?pretty=true
{
“query”: {
“filtered”: {
“filter”: {
“and”: [
{ “query”: {“query_string”: { “query”: “props.name:(* NOT carlover)” } } },
{
“nested”: {
“path”: “props”,
“filter”: {
“or”: [{ “query”: { “term”: { “props.client_id”: 1 } } },{ “missing”: { “field”: “props.client_id” } }
]
}
}
}
]
}
}
}
}
问题内容: 我无法将结果集限制为同时满足以下两个选项的范围和范围的文档。 我想匹配具有“ Core Grower”且介于1到100之间的文档,除非它们也具有“ Connectivity” ( 不在 35到65之间)。 给定以下映射(为简洁起见,省略了非嵌套字段): 我正在执行以下查询: 通过上面的查询,我得到了与“ Core Grower” 匹配且在1到100之间且还具有“ Connectivit
问题内容: 嘿,我想知道是否有人知道使用正则表达式或通配符(或SQL中的pehaps )的方式,以便可以使用JSONPath在大量JSON数据内进行搜索。 例如(是的,我正在解析,而不是在应用程序中读取数据): 我希望能够浏览这样的数据: 其中参数的内容是数据对中部分或全部值的一部分。 目前,我只找到文件上,,,和关系运算符,它不给我那么多的灵活性。 有谁知道一个方法可以让我只是 刚刚 JSONP
我有以下X射线过滤器: 它工作得很好,除了我想要这样的东西: 问题是如何编写X射线过滤器/查询,以便URL不包含特定字符串。 谢谢Brian
问题内容: 我有带有嵌套字段的文档,如下所示: 嵌套字段的映射如下所示: 在切换到elasticsearch 2之前,我有一个带有aggs的查询,该查询计算了没有结果的文档。这是查询的聚合部分: 现在我切换到elasticserach 2,它只计算所有文档。我已经尝试过其他操作,例如计算所有文档和计算结果,以便可以减去结果,但是 总是0 如何正确过滤/计数嵌套字段? 问题答案: 如果您要计算产生结
问题内容: 我有这个映射: 而这个查询: 我等待25个结果,因为我有25个后索引。但是我得到一个空集。如果我删除嵌套的过滤器,一切正常。我希望能够过滤嵌套对象 在我的设置中,我有: 我在这里缺少什么。 谢谢 问题答案: 简短版本: 尝试此操作(更新端点和索引名称后): 它对我有用,并且简化了您的设置。稍后,我将发布带有较长解释的编辑。 编辑:长版: 查询的问题是分析器与查询中的过滤器结合在一起。您
我正在使用弹性搜索。我以前从未使用过的网络NEST客户端。我想做的是在得分前按日期范围过滤结果。 我使用对象初始值设定项语法,因为它最适合我。 我已经完成了我想要的: 这给了我一个JSON请求,就像我期望的那样: 但留档过滤查询说"弃用在2.0.0-beta1.改为使用bool查询,查询的必须子句和筛选器子句”。 因为这是我发现的唯一包含过滤器的方法,有没有更好的方法来使用嵌套对象初始值设定项语法