我有如下查询,
query = {
"query": {"query_string": {"query": "%s" % q}},
"filter":{"ids":{"values":list(ids)}},
"facets": {"destination": {
"terms": {"field": "destination.en"}},
"hotel_class":{
"terms":{"field":"hotel_class"}},
"hotel_type":{
"terms":{"field": "hotel_type"}},
}}
但由于我的ID过滤器,我的方面未被过滤。 我得到了所有方面,但我希望它们通过上面的id过滤器进行过滤。 你有什么想法吗?
答案 0 :(得分:9)
虽然您的工作方式有效,但更简洁的解决方案是进行过滤查询。 http://www.elasticsearch.org/guide/reference/query-dsl/filtered-query/
允许您的原始查询+一些任意过滤器(反过来可以是一个复杂的布尔/嵌套过滤器等)
{
query: {
"filtered" : {
"query": {"query_string": {"query": "%s" % q}},
"filter":{"ids":{"values":list(ids)}},
}
},
"facets": {
"destination": {
"terms": {"field": "destination.en"}
},
"hotel_class": {
"terms": {"field": "hotel_class"}
},
"hotel_type": {
"terms": {"field": "hotel_type"}
}
}
}
理由如下:
因此,如果您希望通过某些过滤器过滤您的构面,则必须在QUERY中包含所述过滤器。
答案 1 :(得分:1)
facet_filter
解决了我的问题,
如下所示,
{
"query": {
"query_string": {
"query": "%s" %q
}
},
"filter": {
"ids": {
"values": list(ids)
}
},
"facets": {
"destination": {
"terms": {
"field": "destination.en"
},
"facet_filter": {
"ids": {
"values": list(ids)
}
}
},
"hotel_class": {
"terms": {
"field": "hotel_class"
},
"facet_filter": {
"ids": {
"values": list(ids)
}
}
},
"hotel_type": {
"terms": {
"field": "hotel_type"
},
"facet_filter": {
"ids": {
"values": list(ids)
}
}
},
}
}