如何在 elasticsearch 中使用 query_string 和过滤器?

How to use query_string with the filter in elasticsearch?

我有一个简单的查询

GET data/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "last_name": "test"
          }
        },
        {
          "bool": {
            "should": {
              "query_string": {
                "query": "henderson OR Boulder City OR Sloan",
                "fields": [
                  "city_*"
                ]
              }
            }
          }
        }
      ]
    }
  }
}

我想将 query_string 更改为过滤器。我不确定如何转换

      {
          "bool": {
            "should": {
              "query_string": {
                "query": "henderson OR Boulder City OR Sloan",
                "fields": [
                  "city_*"
                ]
              }
            }
          }
        }

变成类似

的东西
      "filter": {
        "query_string": {
              "query": "henderson OR Boulder City OR Sloan",
              "fields": [
                  "city_*"
              ]
          }
      }

并确保它按所有这些城市 henderson OR Boulder City OR Sloan 和所有这些字段 city_*.keyword

进行过滤

有什么想法吗?

改变

{
      "bool": {
        "should": {
          "query_string": {
            "query": "henderson OR Boulder City OR Sloan",
            "fields": [
              "city_*"
            ]
          }
        }
      }
    }

  {
      "bool": {
        "filter": {
          "query_string": {
            "query": "henderson OR Boulder City OR Sloan",
            "fields": [
              "city_*"
            ]
          }
        }
      }
    }

这是否得到了您想要的行为?在过滤器下使用相同的查询应该会得到相同的结果,但评分不会由查询加权。

编辑 - 我要提出的另一项建议是将您的查询调整为:

GET data/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "last_name": "test"
          }
        }
      ],
      "filter": [
        {
          "query_string": {
            "query": "henderson OR Boulder City OR Sloan",
              "fields": [
                "city_*"
                ]
          }
        }
      ]        
    }
  }
}

编辑 2 - 您或许可以不再使用 query_string,这会提高您的速度吗? (如果您希望它们不计分,您也可以将 should 更改为嵌套在过滤器中的 "shoulds")

GET data/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "last_name": "test"
          }
        }
      ],
      "should": [
        {
          "match": {
            "city_*": "henderson"
          }
        },
        {
          "match": {
            "city_*": "Boulder City"
          }
        },
        {
          "match": {
            "city_*": "Sloan"
          }
        }
      ]        
    }
  }
}