添加术语过滤器时弹性搜索查询解析异常
elastic search query parsing exception when adding term filter
我不太清楚为什么术语过滤器 "term": {"language": "Austrian"}
会导致弹性搜索解析异常。
令人惊讶的是,如果我删除 query_string 查询,它会起作用。
如果 "term": {"language": "Austrian"}
过滤器不在那里,我会把它放在哪里?
{
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"terms": {
"status_type": [
"1",
"2",
"7"
]
}
}
]
}
},
"filter": {
"query": {
"query_string": {
"fields": [
[
"name",
"message"
]
],
"query": "Arnold AND Schwarz"
}
},
"term": { <-- Causes parse exception
"language": "Austrian"
}
}
}
},
"sort": [
{
"total": {
"order": "desc"
}
}
]
}
在你的filter
里面,你需要一个bool
filter if you have more than one constraints, which is your case, since you have a query
filter and a term
filter。所以正确的做法是这样的:
{
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"terms": {
"status_type": [
"1",
"2",
"7"
]
}
}
]
}
},
"filter": {
"bool": { <---- add this
"must": [ <---- and this
{
"query": {
"query_string": {
"fields": [
[
"name",
"message"
]
],
"query": "Arnold AND Schwarz"
}
}
},
{
"term": {
"language": "Austrian"
}
}
]
}
}
}
},
"sort": [
{
"total": {
"order": "desc"
}
}
]
}
但是,如果我可以添加一些内容,我会以不同的方式重写您的查询并将 query_string
移至 query
部分和 status_type
term
到filter
部分,感觉会更"natural"。此外,在您的 query
部分中,如果您只有一个约束,则不需要 bool/must
。
{
"query": {
"filtered": {
"query": {
"query_string": {
"fields": [
[
"name",
"message"
]
],
"query": "Arnold AND Schwarz"
}
},
"filter": {
"bool": {
"must": [
{
"terms": {
"status_type": [
"1",
"2",
"7"
]
}
},
{
"term": {
"language": "Austrian"
}
}
]
}
}
}
},
"sort": [
{
"total": {
"order": "desc"
}
}
]
}
我不太清楚为什么术语过滤器 "term": {"language": "Austrian"}
会导致弹性搜索解析异常。
令人惊讶的是,如果我删除 query_string 查询,它会起作用。
如果 "term": {"language": "Austrian"}
过滤器不在那里,我会把它放在哪里?
{
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"terms": {
"status_type": [
"1",
"2",
"7"
]
}
}
]
}
},
"filter": {
"query": {
"query_string": {
"fields": [
[
"name",
"message"
]
],
"query": "Arnold AND Schwarz"
}
},
"term": { <-- Causes parse exception
"language": "Austrian"
}
}
}
},
"sort": [
{
"total": {
"order": "desc"
}
}
]
}
在你的filter
里面,你需要一个bool
filter if you have more than one constraints, which is your case, since you have a query
filter and a term
filter。所以正确的做法是这样的:
{
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"terms": {
"status_type": [
"1",
"2",
"7"
]
}
}
]
}
},
"filter": {
"bool": { <---- add this
"must": [ <---- and this
{
"query": {
"query_string": {
"fields": [
[
"name",
"message"
]
],
"query": "Arnold AND Schwarz"
}
}
},
{
"term": {
"language": "Austrian"
}
}
]
}
}
}
},
"sort": [
{
"total": {
"order": "desc"
}
}
]
}
但是,如果我可以添加一些内容,我会以不同的方式重写您的查询并将 query_string
移至 query
部分和 status_type
term
到filter
部分,感觉会更"natural"。此外,在您的 query
部分中,如果您只有一个约束,则不需要 bool/must
。
{
"query": {
"filtered": {
"query": {
"query_string": {
"fields": [
[
"name",
"message"
]
],
"query": "Arnold AND Schwarz"
}
},
"filter": {
"bool": {
"must": [
{
"terms": {
"status_type": [
"1",
"2",
"7"
]
}
},
{
"term": {
"language": "Austrian"
}
}
]
}
}
}
},
"sort": [
{
"total": {
"order": "desc"
}
}
]
}