我可以成功地将multi_match
查询与这样的过滤器结合起来:
{
"query": {
"bool": {
"must":{
"multi_match":{
"query": "ny gammal",
"fields": ["title", "description^1.4"],
"type": "cross_fields"
}
},
"filter":{
"range": {
"modelYear": {"gte": "2017"}
}
}
}
}
}
但是当我尝试添加另一个过滤器时(使用and
因为我希望满足这两个条件),Elasticsearch告诉我我的查询不正确:
{
"query": {
"bool": {
"must":{
"multi_match":{
"query": "ny gammal",
"fields": ["title", "description^1.4"],
"type": "cross_fields"
}
},
"filter":{
"and":[
{
"range": {
"modelYear": {"gte": "2017"}
}
},
{
"term": {
"location": "Kumla"
}
}
]
}
}
}
}
错误讯息:
{
"error": {
"root_cause": [
{
"type": "parsing_exception",
"reason": "[and] query malformed, no start_object after query name",
"line": 12,
"col": 15
}
],
"type": "parsing_exception",
"reason": "[and] query malformed, no start_object after query name",
"line": 12,
"col": 15
},
"status": 400
}
我怎样才能实现我想要的目标?我尝试了很多不同的事情,到目前为止还没有成功。
为了帮助您理解,我想要multi_match
来获取得分文档,然后只保留通过两个过滤器的文件,即"location" == "Kumla"
和modelYear >= 2017
。< / p>
我在文档中随处可见,令我惊讶的是,似乎没有任何关于如何实现这一点的讨论,即组合term
和range
过滤器。
我正在使用Elasticsearch 6。
答案 0 :(得分:1)
你几乎就在那里,使用filter
作为一个简单的数组,因为filter
子句必须匹配所有。
{
"query": {
"bool": {
"must": {
"multi_match": {
"query": "ny gammal",
"fields": [
"title",
"description^1.4"
],
"type": "cross_fields"
}
},
"filter": [
{
"range": {
"modelYear": {
"gte": "2017"
}
}
},
{
"term": {
"location": "Kumla"
}
}
]
}
}
}