我不太确定为什么过滤器"term": {"language": "Austrian"}
一词会导致 Elasticsearch 解析异常。
令人惊讶的是,如果删除了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,这是您的情况,因为您有 query
filter和 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
部分,这会感觉更“自然”。另外,如果只有一个约束,则在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"
}
}
]
}
关于lucene - 添加术语过滤器时的 Elasticsearch 查询解析异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31843878/