弹性搜索中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
查询 永远不会抛出异常,并丢弃无效的部分 查询。
但不清楚。哪个更好?
答案 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
的可能性可能更多,因为只有高级用户才能够以正确的方式构造某些复杂的查询,这对于正在寻找基本搜索解决方案的简单用户而言可能有点过多。