flex 搜索中的simple_query_stringquery_string有什么区别?

哪个更适合搜索?

在 flex 搜索simple_query_string文档中,它们被编写为



但是还不清楚。哪一个更好?

最佳答案

没有简单的答案。这取决于 :)

通常, query_string 专​​用于更高级的用途。它具有更多选项,但正如您所引用的,当发送的查询无法整体解析时,它会引发异常。相反, simple_query_string 的选项较少,但不会对无效部分抛出异常。

作为示例,请看下面两个查询:

GET _search
{
  "query": {
    "query_string": {
      "query": "hyperspace AND crops",
      "fields": [
        "description"
      ]
    }
  }
}

GET _search
{
  "query": {
    "simple_query_string": {
      "query": "hyperspace + crops",
      "fields": [
        "description"
      ]
    }
  }
}

两者均等价,并从您的索引返回相同的结果。但是当您将查询中断并发送时:
GET _search
{
  "query": {
    "query_string": {
      "query": "hyperspace AND crops AND",
      "fields": [
        "description"
      ]
    }
  }
}

GET _search
{
  "query": {
    "simple_query_string": {
      "query": "hyperspace + crops +",
      "fields": [
        "description"
      ]
    }
  }
}

然后,您将仅从第二个结果(simple_query_string)获得结果。第一个(query_string)将抛出如下内容:
{
  "error": {
    "root_cause": [
      {
        "type": "query_shard_exception",
        "reason": "Failed to parse query [hyperspace AND crops AND]",
        "index_uuid": "FWz0DXnmQhyW5SPU3yj2Tg",
        "index": "your_index_name"
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      ...
    ]
  },
  "status": 400
}

希望您现在了解与引发/不引发异常的区别。

哪个更好?如果您想向一些普通最终用户公开搜索,我建议使用simple_query_string。多亏了该最终用户,即使他在查询中犯了一个错误,它也会在每种查询情况下得到一些结果。建议为一些更高级的用户提供query_string,他们将接受如何正确查询语法的培训,以便他们知道为什么在每种情况下都没有任何结果。

10-06 12:38