simple_query_string或query_string哪个更好?

时间:2018-10-31 04:21:13

标签: elasticsearch

弹性搜索中for (var i=0; i<books.length; i+=2) { console.log(books.slice(i, i+2)); } simple_query_string有什么区别?

哪种搜索方式更好?

在弹性搜索query_string文档中,它们是书面的

  

与常规simple_query_string查询不同,query_string查询   永远不会抛出异常,并丢弃无效的部分   查询。

但不清楚。哪个更好?

2 个答案:

答案 0 :(得分:1)

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

通常,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用于一些更高级的用户,他们将接受有关如何正确查询语法的培训,以便他们知道为什么在每种情况下都没有任何结果。

答案 1 :(得分:0)

在@Piotr提到的内容中添加

我了解的是,当您希望外部用户或消费者希望使用搜索解决方案时,simple query string在错误处理和限制用户可能构造的查询方面提供了更好的解决方案。

换句话说,如果搜索解决方案可供任何消费者公开使用,那么我猜simple_query_string是有意义的,但是如果我确实知道我的最终用户是谁,我可以驱使他们按照他们的期望,没有理由我无法通过query_string

公开他们

QueryStringQueryBuilder.java也使用QueryStringQueryParser.java,而SimpleQueryStringBuilder.java使用SimpleQueryStringQueryParser.java,这使我认为解析存在一定的局限性,而创建者肯定不会希望许多功能由最终用户管理。例如dis-max,并且在query_string中可用。

也许simple query string的主要目的是限制最终用户出于其目的使用简单查询,并避免他们采用各种形式的复杂查询和高级功能,以便我们拥有更多控制权< / em>在我们的搜索引擎上(我不太确定,只是一个想法)。

加上误用query_string的可能性可能更多,因为只有高级用户才能够以正确的方式构造某些复杂的查询,这对于正在寻找基本搜索解决方案的简单用户而言可能有点过多。