【问题标题】:elastic search query parsing exception when adding term filter添加术语过滤器时弹性搜索查询解析异常
【发布时间】:2015-08-05 22:28:11
【问题描述】:

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

【问题讨论】:

    标签: lucene elasticsearch elastic-stack


    【解决方案1】:

    在您的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"
          }
        }
      ]
    }
    

    【讨论】:

    • 优秀。谢谢你,瓦尔!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多