对于以下kol_tags.scored.name
选项,我无法将结果集限制为与kol_tags.scored.score
和or
范围匹配的文档。
我希望匹配“{1}”的“核心种植者”和kol_tags.scored.name
介于1和100之间的文档,除非他们还有kol_tags.scored.score
“连接”,其中{{1} } NOT 在35到65之间。
给定以下映射(为简洁省略了非嵌套字段):
kol_tags.scored.name
我正在执行以下查询:
kol_tags.scored.score
通过上面的查询,我得到的文档与“Core Grower”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
}
}
}
]
}
]
}
}
}
}
的1到100之间以及 ALSO 的kol_tags.scored.name
为“连接“和kol_tags.scored.score
在任何范围内。
我需要的是匹配的文件:
kol_tags.scored.name
和1到100之间的kol_tags.scored.score
kol_tags.scored.name
和35到65之间的kol_tags.scored.score
kol_tags.scored.name
“连接”且kol_tags.scored.score
小于34且大于66 答案 0 :(得分:2)
您的描述中存在一些歧义,但我尝试制作一个可在此处运行的可运行示例:https://www.found.no/play/gist/8940202(也在下面嵌入)
以下是我做过的一些事情:
将过滤器放入filtered
- 查询中。只有在您希望过滤匹配而非过滤分数时,才应使用顶级filter
(在Elasticsearch 1.0中重命名为post_filter
。
使用bool
代替and
和or
,因为过滤器是可缓存的。更多信息:http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/
最重要的是,将nested
放在里面bool
,这样逻辑就可以了。什么应该匹配嵌套与父文档。
为您的上一个点添加了must_not
帐户。不确定您是否可以拥有两个名为"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
}
}
}
]
}
]
}
}
}
}
'