Link Search Menu Expand Document Documentation Menu

全文搜索

使用 SQL 命令进行全文搜索。SQL 插件支持 OpenSearch 中可用全文查询的子集。

要了解 OpenSearch 中的全文查询,请参阅全文查询

匹配

使用 MATCH 函数搜索与给定字段的 stringnumberdateboolean 值匹配的文档。

语法

match(field_expression, query_expression[, option=<option_value>]*)

您可以按任意顺序指定以下选项

  • 分析器
  • auto_generate_synonyms_phrase
  • fuzziness
  • max_expansions
  • prefix_length
  • fuzzy_transpositions
  • fuzzy_rewrite
  • lenient
  • operator
  • minimum_should_match
  • zero_terms_query
  • 提升

有关参数说明和支持的值,请参阅 match 查询文档

示例 1:在 message 字段中搜索文本“this is a test”

GET my_index/_search
{
  "query": {
    "match": {
      "message": "this is a test"
    }
  }
}

SQL 查询

SELECT message FROM my_index WHERE match(message, "this is a test")

PPL 查询

SOURCE=my_index | WHERE match(message, "this is a test") | FIELDS message

示例 2:使用 operator 参数搜索 message 字段

GET my_index/_search
{
  "query": {
    "match": {
      "message": {
        "query": "this is a test",
        "operator": "and"
      }
    }
  }
}

SQL 查询

SELECT message FROM my_index WHERE match(message, "this is a test", operator='and')

PPL 查询

SOURCE=my_index | WHERE match(message, "this is a test", operator='and') | FIELDS message

示例 3:使用 operatorzero_terms_query 参数搜索 message 字段

GET my_index/_search
{
  "query": {
    "match": {
      "message": {
        "query": "to be or not to be",
        "operator": "and",
        "zero_terms_query": "all"
      }
    }
  }
}

SQL 查询

SELECT message FROM my_index WHERE match(message, "this is a test", operator='and', zero_terms_query='all')

PPL 查询

SOURCE=my_index | WHERE match(message, "this is a test", operator='and', zero_terms_query='all') | FIELDS message

多字段匹配

要在多个字段中搜索文本,请使用 MULTI_MATCH 函数。此函数映射到搜索引擎中使用的 multi_match 查询,以返回与给定字段或多个字段中的所提供文本、数字、日期或布尔值匹配的文档。

语法

MULTI_MATCH 函数通过使用 ^ 字符来提升某些字段。提升值是乘数,它使一个字段中的匹配项比其他字段中的匹配项更重要。语法支持使用双引号、单引号、反引号或不带任何引号来指定字段。使用星号 "*" 搜索所有字段。星号符号应加引号。

multi_match([field_expression+], query_expression[, option=<option_value>]*)

权重是可选的,并在字段名称之后指定。它可以由脱字号字符 — ^ 或空格分隔。请参阅以下示例

multi_match(["Tags" ^ 2, 'Title' 3.4, `Body`, Comments ^ 0.3], ...)
multi_match(["*"], ...)

您可以按任意顺序指定 MULTI_MATCH 的以下选项

  • 分析器
  • auto_generate_synonyms_phrase
  • cutoff_frequency
  • fuzziness
  • fuzzy_transpositions
  • lenient
  • max_expansions
  • minimum_should_match
  • operator
  • prefix_length
  • tie_breaker
  • type
  • slop
  • zero_terms_query
  • 提升

有关参数说明和支持的值,请参阅 multi_match 查询文档

例如,在 firstnamelastname 字段中搜索“Dale”的 REST API 搜索请求

GET accounts/_search
{
  "query": {
    "multi_match": {
      "query": "Lane Street",
      "fields": [ "address" ],
    }
  }
}

可以使用 multi_match 函数从 SQL 调用

SELECT firstname, lastname
FROM accounts
WHERE multi_match(['*name'], 'Dale')

multi_match PPL 函数

SOURCE=accounts | WHERE multi_match(['*name'], 'Dale') | fields firstname, lastname
firstname lastname
Dale Adams

查询字符串

要根据运算符拆分文本,请使用 QUERY_STRING 函数。QUERY_STRING 函数支持逻辑连接符、通配符、正则表达式和近距离搜索。此函数映射到搜索引擎中使用的 query_string 查询,以返回与给定字段或多个字段中的所提供文本、数字、日期或布尔值匹配的文档。

语法

QUERY_STRING 函数的语法类似于 MATCH_QUERY,它通过使用 ^ 字符来提升某些字段。提升值是乘数,它使一个字段中的匹配项比其他字段中的匹配项更重要。语法支持使用双引号、单引号、反引号或不带任何引号来指定字段。使用星号 "*" 搜索所有字段。星号符号应加引号。

query_string([field_expression+], query_expression[, option=<option_value>]*)

权重是可选的,并在字段名称之后指定。它可以由脱字号字符 — ^ 或空格分隔。请参阅以下示例

query_string(["Tags" ^ 2, 'Title' 3.4, `Body`, Comments ^ 0.3], ...)
query_string(["*"], ...)

您可以按任意顺序指定 QUERY_STRING 的以下选项

  • 分析器
  • allow_leading_wildcard
  • analyze_wildcard
  • auto_generate_synonyms_phrase_query
  • 提升
  • default_operator
  • enable_position_increments
  • fuzziness
  • fuzzy_rewrite
  • escape
  • fuzzy_max_expansions
  • fuzzy_prefix_length
  • fuzzy_transpositions
  • lenient
  • 最大确定化状态 (max_determinized_states)
  • minimum_should_match
  • quote_analyzer
  • phrase_slop
  • quote_field_suffix
  • 重写 (rewrite)
  • type
  • tie_breaker
  • time_zone

有关参数说明和支持的值,请参阅 query_string 查询文档

在 SQL 和 PPL 查询中使用 query_string 的示例

REST API 搜索请求

GET accounts/_search
{
  "query": {
    "query_string": {
      "query": "Lane Street",
      "fields": [ "address" ],
    }
  }
}

可以从 SQL 调用

SELECT account_number, address
FROM accounts
WHERE query_string(['address'], 'Lane Street', default_operator='OR')

或从 PPL 调用

SOURCE=accounts | WHERE query_string(['address'], 'Lane Street', default_operator='OR') | fields account_number, address
account_number address
1 880 Holmes Lane
6 671 Bristol Street
13 789 Madison Street

匹配短语

要搜索精确短语,请使用 MATCHPHRASEMATCH_PHRASE 函数。

语法

matchphrasequery(field_expression, query_expression)
matchphrase(field_expression, query_expression[, option=<option_value>]*)
match_phrase(field_expression, query_expression[, option=<option_value>]*)

MATCHPHRASE/MATCH_PHRASE 函数允许您按任意顺序指定以下选项

  • 分析器
  • slop
  • zero_terms_query
  • 提升

有关参数说明和支持的值,请参阅 match_phrase 查询文档

在 SQL 和 PPL 查询中使用 match_phrase 的示例

REST API 搜索请求

GET accounts/_search
{
  "query": {
    "match_phrase": {
      "address": {
        "query": "880 Holmes Lane"
      }
    }
  }
}

可以从 SQL 调用

SELECT account_number, address
FROM accounts
WHERE match_phrase(address, '880 Holmes Lane')

PPL

SOURCE=accounts | WHERE match_phrase(address, '880 Holmes Lane') | FIELDS account_number, address
account_number address
1 880 Holmes Lane

简单查询字符串

simple_query_string 函数映射到 OpenSearch 中的 simple_query_string 查询。它返回与给定字段或多个字段中的所提供文本、数字、日期或布尔值匹配的文档。^ 允许您提升某些字段。提升值是乘数,它使一个字段中的匹配项比其他字段中的匹配项更重要。

语法

语法支持使用双引号、单引号、反引号或不带任何引号来指定字段。使用星号 "*" 搜索所有字段。星号符号应加引号。

simple_query_string([field_expression+], query_expression[, option=<option_value>]*)

权重是可选的,并在字段名称之后指定。它可以由脱字号字符 — ^ 或空格分隔。请参阅以下示例

simple_query_string(["Tags" ^ 2, 'Title' 3.4, `Body`, Comments ^ 0.3], ...)
simple_query_string(["*"], ...)

您可以按任意顺序指定 SIMPLE_QUERY_STRING 的以下选项

  • analyze_wildcard
  • 分析器
  • auto_generate_synonyms_phrase_query
  • 提升
  • default_operator
  • 标志 (flags)
  • fuzzy_max_expansions
  • fuzzy_prefix_length
  • fuzzy_transpositions
  • lenient
  • minimum_should_match
  • quote_field_suffix

有关参数说明和支持的值,请参阅 simple_query_string 查询文档

在 SQL 和 PPL 查询中使用 simple_query_string示例

REST API 搜索请求

GET accounts/_search
{
  "query": {
    "simple_query_string": {
      "query": "Lane Street",
      "fields": [ "address" ],
    }
  }
}

可以从 SQL 调用

SELECT account_number, address
FROM accounts
WHERE simple_query_string(['address'], 'Lane Street', default_operator='OR')

或从 PPL 调用

SOURCE=accounts | WHERE simple_query_string(['address'], 'Lane Street', default_operator='OR') | fields account_number, address
account_number address
1 880 Holmes Lane
6 671 Bristol Street
13 789 Madison Street

匹配短语前缀

为了根据给定前缀搜索短语,使用 MATCH_PHRASE_PREFIX 函数从查询字符串的最后一个词创建前缀查询。

语法

match_phrase_prefix(field_expression, query_expression[, option=<option_value>]*)

MATCH_PHRASE_PREFIX 函数允许您按任意顺序指定以下选项

  • 分析器
  • slop
  • max_expansions
  • zero_terms_query
  • 提升

请参考 match_phrase_prefix 查询的文档,了解参数说明和支持的值。

在 SQL 和 PPL 查询中使用 match_phrase_prefix示例

REST API 搜索请求

GET accounts/_search
{
  "query": {
    "match_phrase_prefix": {
      "author": {
        "query": "Alexander Mil"
      }
    }
  }
}

可以从 SQL 调用

SELECT author, title
FROM books
WHERE match_phrase_prefix(author, 'Alexander Mil')

PPL

source=books | where match_phrase_prefix(author, 'Alexander Mil') | fields author, title
作者 标题
艾伦·亚历山大·米尔恩 小熊维尼的角落之家
艾伦·亚历山大·米尔恩 小熊维尼

匹配布尔前缀

使用 match_bool_prefix 函数搜索仅匹配给定字段前缀文本的文档。

语法

match_bool_prefix(field_expression, query_expression[, option=<option_value>]*)

MATCH_BOOL_PREFIX 函数允许您按任意顺序指定以下选项

  • minimum_should_match
  • fuzziness
  • prefix_length
  • max_expansions
  • fuzzy_transpositions
  • fuzzy_rewrite
  • 提升
  • 分析器
  • operator

请参考 match_bool_prefix 查询的文档,了解参数说明和支持的值。

在 SQL 和 PPL 查询中使用 match_bool_prefix 的示例

REST API 搜索请求

GET accounts/_search
{
  "query": {
    "match_bool_prefix": {
      "address": {
        "query": "Bristol Stre"
      }
    }
  }
}

可以从 SQL 调用

SELECT firstname, address
FROM accounts
WHERE match_bool_prefix(address, 'Bristol Stre')

PPL

source=accounts | where match_bool_prefix(address, 'Bristol Stre') | fields firstname, address
firstname address
哈蒂 671 Bristol Street
娜内特 789 Madison Street