在弹性搜索中,simple_query_string和query_string有什么区别?
哪一个更适合搜索?
在弹性搜索simple_query_string文档中,它们是编写的。
与常规的
query_string查询不同,simple_query_string查询永远不会抛出异常并丢弃查询的无效部分。
但还不清楚。哪一个更好?
发布于 2018-10-31 10:44:07
没有简单的答案。视情况而定:)
通常,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推荐给一些更高级的用户,他们将接受关于如何正确的查询语法的培训,这样他们就会知道为什么在每个特定情况下他们都没有任何结果。
发布于 2018-10-31 12:20:45
加上@Piotr提到的,
我理解的是,当您希望外部用户或使用者希望使用搜索解决方案时,simple query string在错误处理和限制用户可能构建的查询类型方面提供了更好的解决方案。
换句话说,如果搜索解决方案是公开的,任何消费者都可以使用该解决方案,那么我猜simple_query_string是有意义的,但是如果我知道我的最终用户是谁,我就可以把他们作为他们想要的东西来驱动,没有理由我不能通过query_string公开他们。
此外,QueryStringQueryBuilder.java使用QueryStringQueryParser.java,而SimpleQueryStringBuilder.java使用SimpleQueryStringQueryParser.java,这使我认为解析中存在一定的限制,而且创建者肯定不希望由最终用户来管理许多特性。适用于.e.g dis-max,可在query_string中使用。
也许simple query string的主要目的是限制终端用户使用简单的查询来达到他们的目的,而没有任何形式的复杂查询和高级功能,这样我们就可以更好地控制我们的搜索引擎(我不太确定,但只是一个想法)。
此外,误用query_string的可能性可能更大,因为只有高级用户才能以正确的方式构造某些复杂的查询,这对于正在寻找基本搜索解决方案的简单用户来说可能有点过分。
https://stackoverflow.com/questions/53076255
复制相似问题