简单查询字符串查询
使用 simple_query_string
类型直接在查询字符串中指定由正则表达式分隔的多个参数。简单查询字符串的语法比查询字符串宽松,因为它会丢弃字符串中任何无效的部分,并且不会因无效语法而返回错误。
此查询使用简单语法,根据特殊运算符解析查询字符串,并将字符串拆分为词条。解析后,查询会独立分析每个词条,然后返回匹配的文档。
以下查询对 title
字段执行模糊搜索
GET _search
{
"query": {
"simple_query_string": {
"query": "\"rises wind the\"~4 | *ising~2",
"fields": ["title"]
}
}
}
简单查询字符串语法
查询字符串由*词条*和*运算符*组成。词条是单个单词(例如,在查询 wind rises
中,词条是 wind
和 rises
)。如果多个词条用引号括起来,它们将被视为一个短语,其中单词按出现的顺序匹配(例如,"wind rises"
)。诸如 +
、|
和 -
等运算符指定用于解释查询字符串中文本的布尔逻辑。
运算符
简单查询字符串语法支持以下运算符。
运算符 | 描述 |
---|---|
+ | 作为 AND 运算符。 |
| | 作为 OR 运算符。 |
* | 当用在词条末尾时,表示前缀查询。 |
" | 将多个词条封装成一个短语(例如,"wind rises" )。 |
( , ) | 用括号括起一个子句以表示优先级(例如,wind + (rises | rising) )。 |
~n | 当用在词条后面(例如,wnid~3 )时,设置 fuzziness 。当用在短语后面时,设置 slop 。 |
- | 否定词条。 |
所有上述运算符都是保留字符。要将它们作为原始字符而非运算符引用,请使用反斜杠对其进行转义。发送 JSON 请求时,使用 \\
转义保留字符(因为反斜杠字符本身是保留字符,所以必须用另一个反斜杠转义反斜杠)。
默认运算符
默认运算符是 OR
(除非您将 default_operator
设置为 AND
)。默认运算符决定了整体查询行为。例如,考虑一个包含以下文档的索引
PUT /customers/_doc/1
{
"first_name":"Amber",
"last_name":"Duke",
"address":"880 Holmes Lane"
}
PUT /customers/_doc/2
{
"first_name":"Hattie",
"last_name":"Bond",
"address":"671 Bristol Street"
}
PUT /customers/_doc/3
{
"first_name":"Nanette",
"last_name":"Bates",
"address":"789 Madison St"
}
PUT /customers/_doc/4
{
"first_name":"Dale",
"last_name":"Amber",
"address":"467 Hutchinson Court"
}
以下查询尝试查找地址中包含词语 street
或 st
且不包含词语 madison
的文档
GET /customers/_search
{
"query": {
"simple_query_string": {
"fields": [ "address" ],
"query": "street st -madison"
}
}
}
然而,结果不仅包含预期文档,还包含所有四个文档
响应
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": 2.2039728,
"hits": [
{
"_index": "customers",
"_id": "2",
"_score": 2.2039728,
"_source": {
"first_name": "Hattie",
"last_name": "Bond",
"address": "671 Bristol Street"
}
},
{
"_index": "customers",
"_id": "3",
"_score": 1.2039728,
"_source": {
"first_name": "Nanette",
"last_name": "Bates",
"address": "789 Madison St"
}
},
{
"_index": "customers",
"_id": "1",
"_score": 1,
"_source": {
"first_name": "Amber",
"last_name": "Duke",
"address": "880 Holmes Lane"
}
},
{
"_index": "customers",
"_id": "4",
"_score": 1,
"_source": {
"first_name": "Dale",
"last_name": "Amber",
"address": "467 Hutchinson Court"
}
}
]
}
}
由于默认运算符是 OR
,此查询包含包含词语 street
或 st
的文档(文档 2 和 3),以及不包含词语 madison
的文档(文档 1 和 4)。
为了正确表达查询意图,请在 -madison
前面加上 +
GET /customers/_search
{
"query": {
"simple_query_string": {
"fields": [ "address" ],
"query": "street st +-madison"
}
}
}
或者,将 AND
指定为默认运算符,并对词语 street
和 st
使用析取。
GET /customers/_search
{
"query": {
"simple_query_string": {
"fields": [ "address" ],
"query": "st|street -madison",
"default_operator": "AND"
}
}
}
前面的查询返回文档 2
响应
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 2.2039728,
"hits": [
{
"_index": "customers",
"_id": "2",
"_score": 2.2039728,
"_source": {
"first_name": "Hattie",
"last_name": "Bond",
"address": "671 Bristol Street"
}
}
]
}
}
限制运算符
要限制简单查询字符串解析器支持的运算符,请在 flags
参数中包含您希望支持的运算符,并用 |
分隔。例如,以下查询仅启用 OR
、AND
和 FUZZY
运算符
GET /customers/_search
{
"query": {
"simple_query_string": {
"fields": [ "address" ],
"query": "bristol | madison +stre~2",
"flags": "OR|AND|FUZZY"
}
}
}
下表列出了所有可用的运算符标志。
标志 | 描述 |
---|---|
ALL (默认) | 启用所有运算符。 |
AND | 启用 + (AND )运算符。 |
ESCAPE | 启用 \ 作为转义字符。 |
FUZZY | 启用单词后的 ~n 运算符,其中 n 是表示允许匹配的编辑距离的整数。 |
NEAR | 启用短语后的 ~n 运算符,其中 n 是匹配词元之间允许的最大位置数。与 SLOP 相同。 |
NONE | 禁用所有运算符。 |
NOT | 启用 - (NOT )运算符。 |
OR | 启用 | (OR )运算符。 |
PHRASE | 启用 " (引号)用于短语搜索。 |
PRECEDENCE | 启用 ( 和 ) (括号)运算符用于运算符优先级。 |
PREFIX | 启用 * (前缀)运算符。 |
SLOP | 启用短语后的 ~n 运算符,其中 n 是匹配词元之间允许的最大位置数。与 NEAR 相同。 |
WHITESPACE | 启用空格字符作为文本拆分的字符。 |
通配符表达式
您可以使用特殊字符 *
指定通配符表达式,该字符替换零个或多个字符。例如,以下查询在所有以 name
结尾的字段中进行搜索
GET /customers/_search
{
"query": {
"simple_query_string" : {
"query": "Amber Bond",
"fields": [ "*name" ]
}
}
}
提升
使用插入符号(^
)增强运算符通过乘数增强字段的相关性得分。范围 [0, 1) 中的值会降低相关性,大于 1 的值会增加相关性。默认值为 1
。
例如,以下查询搜索 first_name
和 last_name
字段,并将 first_name
字段的匹配项增强 2 倍
GET /customers/_search
{
"query": {
"simple_query_string" : {
"query": "Amber",
"fields": [ "first_name^2", "last_name" ]
}
}
}
多位置词元
对于多位置词元,简单查询字符串会创建一个匹配短语查询。因此,如果您将 ml, machine learning
指定为同义词并搜索 ml
,OpenSearch 将搜索 ml OR "machine learning"
。
或者,您可以使用合取匹配多位置词元。如果您将 auto_generate_synonyms_phrase_query
设置为 false
,OpenSearch 将搜索 ml OR (machine AND learning)
。
例如,以下查询搜索文本 ml models
并指定不对每个同义词自动生成匹配短语查询
GET /testindex/_search
{
"query": {
"simple_query_string": {
"fields": ["title"],
"query": "ml models",
"auto_generate_synonyms_phrase_query": false
}
}
}
对于此查询,OpenSearch 创建以下布尔查询:(ml OR (machine AND learning)) models
。
参数
下表列出了 simple_query_string
查询支持的顶级参数。除 query
外,所有参数均为可选。
参数 | 数据类型 | 描述 |
---|---|---|
query | 字符串 | 用于搜索的文本,其中可能包含简单查询字符串语法中的表达式。必需。 |
analyze_wildcard | 布尔型 | 指定 OpenSearch 是否应尝试分析通配符词条。默认值为 false 。 |
分析器 | 字符串 | 用于分词查询字符串文本的分析器。默认是为 default_field 指定的索引时分析器。如果未为 default_field 指定分析器,则 analyzer 是索引的默认分析器。有关 index.query.default_field 的更多信息,请参阅动态索引级别索引设置。 |
auto_generate_synonyms_phrase_query | 布尔型 | 指定是否自动为多词条同义词创建匹配短语查询。默认值为 true 。 |
default_operator | 字符串 | 如果查询字符串包含多个搜索词条,则文档是否需要所有词条都匹配(AND )或只需一个词条匹配(OR )才被视为匹配。有效值为- OR :字符串 to be 被解释为 to OR be - AND :字符串 to be 被解释为 to AND be 默认值为 OR 。 |
fields | 字符串数组 | 要搜索的字段列表(例如,"fields": ["title^4", "description"] )。支持通配符。如果未指定,则默认为 index.query.default_field 设置,该设置默认为 ["*"] 。可以同时搜索的最大字段数由 indices.query.bool.max_clause_count 定义,默认值为 1,024。 |
标志 (flags) | 字符串 | 一个以 | 分隔的标志字符串,用于启用(例如,AND|OR|NOT )。默认值为 ALL 。您可以显式设置 default_field 的值。例如,要返回所有标题,请将其设置为 "default_field": "title" 。 |
fuzzy_max_expansions | 正整数 | 查询可以扩展到的最大词条数。模糊查询“扩展到”在 fuzziness 中指定的距离内的多个匹配词条。然后 OpenSearch 尝试匹配这些词条。默认值为 50 。 |
fuzzy_transpositions | 布尔型 | 将 fuzzy_transpositions 设置为 true (默认)会将相邻字符的交换添加到 fuzziness 选项的插入、删除和替换操作中。例如,如果 fuzzy_transpositions 为 true(交换“n”和“i”),则 wind 和 wnid 之间的距离为 1;如果为 false(删除“n”,插入“n”),则距离为 2。如果 fuzzy_transpositions 为 false,则 rewind 和 wnid 与 wind 的距离相同(2),尽管以人为中心来看 wnid 是一个明显的打字错误。默认值适用于大多数用例。 |
fuzzy_prefix_length | 整数 | 模糊匹配时保留不变的起始字符数。默认值为 0。 |
lenient | 布尔型 | 将 lenient 设置为 true 会忽略查询与文档字段之间的数据类型不匹配。例如,查询字符串 "8.2" 可以匹配 float 类型的字段。默认值为 false 。 |
minimum_should_match | 正或负整数,正或负百分比,组合 | 如果查询字符串包含多个搜索词条且您使用 or 运算符,则文档被视为匹配所需的匹配词条数。例如,如果 minimum_should_match 为 2,则 wind often rising 不会匹配 The Wind Rises. 。如果 minimum_should_match 为 1 ,则会匹配。有关详细信息,请参阅Minimum should match。 |
quote_field_suffix | 字符串 | 此选项支持使用与非精确匹配不同的分析方法搜索精确匹配项(用引号括起来)。例如,如果 quote_field_suffix 是 .exact 并且您在 title 字段中搜索 \"lightly\" ,OpenSearch 将在 title.exact 字段中搜索单词 lightly 。第二个字段可能使用不同的类型(例如,keyword 而不是 text )或不同的分析器。 |