在同一搜索中使用关键字和文本字段查询字符串查询

时间:2019-04-18 21:37:52

标签: elasticsearch

从Elasticsearch 5.x升级到6.x。我们广泛使用查询字符串查询,并通常构造使用不同类型字段的查询。

在5.x中,以下查询正常运行且没有错误:

{
  "query": {
    "query_string": {
      "query": "my_keyword_field:\"Exact Phrase Here\" my_text_field:(any words) my_other_text_field:\"Another phrase here\" date_field:[2018-01-01 TO 2018-05-01]",
      "default_operator": "AND",
      "analyzer": "custom_text"
    }
  }
}

在6.x中,此查询将返回以下错误:

{
  "type": "illegal_state_exception",
  "reason": "field:[my_keyword_field] was indexed without position data; cannot run PhraseQuery"
}

如果我将短语用括号而不是用引号引起来,则搜索将返回0个结果:

{
  "query": {
    "query_string": {
      "query": "my_keyword_field:(Exact Phrase Here)",
      "default_operator": "AND",
      "analyzer": "custom_text"
    }
  }
}

我猜这是因为分析器阻止传入查询的方式与数据如何存储在关键字字段中之间存在冲突,但是短语方法(my_keyword_field:"Exact Phrase Here")在5.x中确实有效。

6.x不再支持此功能吗?如果没有,那么迁移路径和/或好的解决方法是什么?

1 个答案:

答案 0 :(得分:0)

最好使用可用于不同用例的不同类型的查询来重新表述查询。例如,使用term query精确搜索关键字字段。将range query用于范围等。

您可以重新设置查询,如下所示:

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "my_text_field:(any words) my_other_text_field:\"Another phrase here\"",
            "default_operator": "AND",
            "analyzer": "custom_text"
          }
        },
        {
          "term": {
            "my_keyword_field": "Exact Phrase Here"
          }
        },
        {
          "range": {
            "date_field": {
              "gte": "2018-01-01",
              "lte": "2018-05-01"
            }
          }
        }
      ]
    }
  }
}