简单查询字符串查询编辑

根据提供的查询字符串,使用语法有限但容错的解析器返回文档。

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

虽然其语法比query_string 查询更受限制,但simple_query_string 查询不会因语法无效而返回错误。相反,它会忽略查询字符串中任何无效的部分。

示例请求编辑

response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: '"fried eggs" +(eggplant | potato) -frittata',
        fields: [
          'title^5',
          'body'
        ],
        default_operator: 'and'
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "\"fried eggs\" +(eggplant | potato) -frittata",
        "fields": ["title^5", "body"],
        "default_operator": "and"
    }
  }
}

simple_query_string 的顶级参数编辑

query
(必填,字符串)要解析并用于搜索的查询字符串。请参阅简单查询字符串语法
fields

(可选,字符串数组)要搜索的字段数组。

此字段接受通配符表达式。您还可以使用插入符号 (^) 表示法来提高与特定字段匹配的相关性得分。有关示例,请参阅fields 参数中的通配符和按字段提升

默认为index.query.default_field 索引设置,其默认值为** 值会提取所有符合词条查询条件的字段,并过滤掉元数据字段。如果没有指定prefix,则会组合所有提取的字段来构建查询。

一次可以查询的字段数量有限制。它由indices.query.bool.max_clause_count 搜索设置定义,默认为1024

default_operator

(可选,字符串)如果没有指定运算符,则用于解释查询字符串中文本的默认布尔逻辑。有效值为:

OR(默认)
例如,查询字符串capital of Hungary 会被解释为capital OR of OR Hungary
AND
例如,查询字符串capital of Hungary 会被解释为capital AND of AND Hungary
analyze_wildcard
(可选,布尔值)如果为true,则查询会尝试分析查询字符串中的通配符词条。默认为false
analyzer
(可选,字符串)用于将查询字符串中的文本转换为词条的分析器。默认为为default_field 映射的索引时间分析器。如果没有映射分析器,则使用索引的默认分析器。
auto_generate_synonyms_phrase_query
(可选,布尔值)如果为true,则解析器会为每个多位置词条创建一个match_phrase 查询。默认为true。有关示例,请参阅多位置词条
flags
(可选,字符串)为简单查询字符串语法启用的运算符列表。默认为ALL(所有运算符)。有关有效值,请参阅限制运算符
fuzzy_max_expansions
(可选,整数)查询为模糊匹配而扩展到的最大词条数。默认为50
fuzzy_prefix_length
(可选,整数)为模糊匹配而保持不变的开头字符数。默认为0
fuzzy_transpositions
(可选,布尔值)如果为true,则模糊匹配的编辑包括两个相邻字符的换位 (ab → ba)。默认为true
lenient
(可选,布尔值)如果为true,则会忽略基于格式的错误,例如为数字字段提供文本值。默认为false
minimum_should_match
(可选,字符串)文档必须匹配的最小子句数才能返回。有关有效值和更多信息,请参阅minimum_should_match 参数
quote_field_suffix

(可选,字符串)附加到查询字符串中带引号文本的后缀。

您可以使用此后缀对精确匹配使用不同的分析方法。请参阅将精确搜索与词干提取混合使用

注意编辑

简单查询字符串语法编辑

simple_query_string 查询支持以下运算符:

  • + 表示 AND 运算
  • | 表示 OR 运算
  • - 对单个词条取反
  • " 将多个词条括起来,表示要搜索的短语
  • * 在词条末尾表示前缀查询
  • () 表示优先级
  • ~N 在词条后表示编辑距离(模糊度)
  • ~N 在短语后表示偏差量

要按字面意思使用其中一个字符,请在其前面加上反斜杠 (\) 进行转义。

这些运算符的行为可能因default_operator 值而异。例如:

response = client.search(
  body: {
    query: {
      simple_query_string: {
        fields: [
          'content'
        ],
        query: 'foo bar -baz'
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "simple_query_string": {
      "fields": [ "content" ],
      "query": "foo bar -baz"
    }
  }
}

此搜索旨在仅返回包含foobar包含baz 的文档。但是,由于default_operatorOR,因此此搜索实际上会返回包含foobar 的文档以及任何不包含baz 的文档。要按预期返回文档,请将查询字符串更改为foo bar +-baz

限制运算符编辑

您可以使用flags 参数来限制简单查询字符串语法支持的运算符。

要仅显式启用特定运算符,请使用| 分隔符。例如,flags 值为OR|AND|PREFIX 会禁用除ORANDPREFIX 之外的所有运算符。

response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'foo | bar + baz*',
        flags: 'OR|AND|PREFIX'
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "foo | bar + baz*",
      "flags": "OR|AND|PREFIX"
    }
  }
}
有效值编辑

可用的标志有:

ALL(默认)
启用所有可选运算符。
AND
AND
启用+ AND 运算符。
ESCAPE
启用\ 作为转义字符。
FUZZY
在词条后启用~N 运算符,其中N 是一个整数,表示匹配允许的编辑距离。请参阅模糊度
NEAR
在短语后启用~N 运算符,其中N 是匹配词条之间允许的最大位置数。与SLOP 同义。
NONE
禁用所有运算符。
NOT
启用- NOT 运算符。
OR
启用\| OR 运算符。
PHRASE
启用用于搜索短语的" 引号运算符。
PRECEDENCE
启用() 运算符来控制运算符优先级。
PREFIX
启用* 前缀运算符。
SLOP
在短语后启用~N 运算符,其中N 是匹配词条之间允许的最大位置数。与NEAR 同义。
WHITESPACE

启用空格作为分隔符。

fields 参数中的通配符和按字段提升编辑

response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'Will Smith',
        fields: [
          'title',
          '*_name'
        ]
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "simple_query_string" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ] 
    }
  }
}

可以使用通配符指定字段,例如:

查询titlefirst_namelast_name 字段。

response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'this is a test',
        fields: [
          'subject^3',
          'message'
        ]
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "simple_query_string" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ] 
    }
  }
}

可以使用插入符号 (^) 表示法来提升单个字段:

subject 字段的重要性是message 字段的三倍。

多位置词条编辑

默认情况下,simple_query_string 查询解析器会为查询字符串中的每个多位置词条创建一个match_phrase 查询。例如,解析器会为多词同义词ny, new york 创建一个match_phrase 查询:

(ny OR ("new york"))

response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'ny city',
        auto_generate_synonyms_phrase_query: false
      }
    }
  }
)
puts response
GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "ny city",
      "auto_generate_synonyms_phrase_query": false
    }
  }
}

对于上面的例子,解析器会创建以下 bool 查询

(ny OR (new AND york)) city)

这个 bool 查询匹配包含词条 ny 或连接词 new AND york 的文档。