添加术语过滤器时弹性搜索查询解析异常

时间:2015-08-05 22:28:11

标签: lucene elasticsearch elastic-stack

我不太清楚为什么术语过滤器"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"
      }
    }
  ]
}

1 个答案:

答案 0 :(得分:1)

filter内,如果您有多个约束,则需要bool filter,这是您的情况,因为您有query filterterm 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"
      }
    }
  ]
}