Link Search Menu Expand Document Documentation Menu

简单查询字符串查询

使用 simple_query_string 类型直接在查询字符串中指定由正则表达式分隔的多个参数。简单查询字符串的语法比查询字符串宽松,因为它会丢弃字符串中任何无效的部分,并且不会因无效语法而返回错误。

此查询使用简单语法,根据特殊运算符解析查询字符串,并将字符串拆分为词条。解析后,查询会独立分析每个词条,然后返回匹配的文档。

以下查询对 title 字段执行模糊搜索

GET _search
{
  "query": {
    "simple_query_string": {
      "query": "\"rises wind the\"~4 | *ising~2",
      "fields": ["title"]
    }
  }
}

简单查询字符串语法

查询字符串由*词条*和*运算符*组成。词条是单个单词(例如,在查询 wind rises 中,词条是 windrises)。如果多个词条用引号括起来,它们将被视为一个短语,其中单词按出现的顺序匹配(例如,"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"
}

以下查询尝试查找地址中包含词语 streetst 且不包含词语 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,此查询包含包含词语 streetst 的文档(文档 2 和 3),以及不包含词语 madison 的文档(文档 1 和 4)。

为了正确表达查询意图,请在 -madison 前面加上 +

GET /customers/_search
{
  "query": {
    "simple_query_string": {
      "fields": [ "address" ],
      "query": "street st +-madison"
    }
  }
}

或者,将 AND 指定为默认运算符,并对词语 streetst 使用析取。

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 参数中包含您希望支持的运算符,并用 | 分隔。例如,以下查询仅启用 ORANDFUZZY 运算符

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_namelast_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”),则 windwnid 之间的距离为 1;如果为 false(删除“n”,插入“n”),则距离为 2。如果 fuzzy_transpositions 为 false,则 rewindwnidwind 的距离相同(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_match1,则会匹配。有关详细信息,请参阅Minimum should match
quote_field_suffix 字符串 此选项支持使用与非精确匹配不同的分析方法搜索精确匹配项(用引号括起来)。例如,如果 quote_field_suffix.exact 并且您在 title 字段中搜索 \"lightly\",OpenSearch 将在 title.exact 字段中搜索单词 lightly。第二个字段可能使用不同的类型(例如,keyword 而不是 text)或不同的分析器。
剩余 350 字符

有问题?

想贡献?