0

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

1 回答 1

1

在你的内部,如果你有多个约束,filter你需要一个bool过滤器,这是你的情况,因为你有一个queryfilter和一个termfilter。所以正确的做法是这样的:

{
  "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_stringover 移至querypart 并将status_type termover 移至filterpart,这会感觉更“自然”。此外,就您而言,如果您只有一个约束,则query不需要 a 。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"
      }
    }
  ]
}
于 2015-08-06T03:22:40.700 回答