当前位置: 首页 > 工具软件 > quick-query > 使用案例 >

query string 查询

萧嘉茂
2023-12-01

使用具有严格语法的解析器,根据提供的查询字符串返回文档。

该查询使用一种语法来基于操作符(如and或NOT)解析和分割提供的查询字符串。然后,在返回匹配文档之前,查询会独立地分析每个拆分文本。

可以使用query_string查询创建包含通配符、跨多个字段的搜索等的复杂搜索。虽然是通用的,但查询是严格的,如果查询字符串包含任何无效的语法,则返回错误。

示例查询

当运行以下搜索时,query_string查询将(new york city) OR (big apple)分为两个部分:new york city和big apple。该 content字段的分析器然后在返回匹配文档之前独立地将每个部分转换为标记。因为查询语法不使用空格作为运算符,new york city所以按原样传递给分析器。

GET /_search
{
  "query": {
    "query_string": {
      "query": "(new york city) OR (big apple)",
      "default_field": "content"
    }
  }
}

顶层参数

query (必需,字符串)您希望解析并用于搜索的查询字符串。请参阅 查询字符串语法

default_field (可选,字符串)如果查询字符串中未提供任何字段,则您希望搜索的默认字段。默认为index.query.default_field索引设置,其默认值为*。该*值提取所有符合术语查询条件的字段并过滤元数据字段。如果没有prefix指定,所有提取的字段然后被组合以构建查询。

搜索所有符合条件的字段不包括嵌套文档。使用nested查询来搜索这些文档。

对于具有大量字段的映射,搜索所有符合条件的字段可能会很昂贵。

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

allow_leading_wildcard (可选,布尔值)如果true,通配符*?允许作为查询字符串的第一个字符。默认为true.

analyze_wildcard (可选,布尔值)如果true,则查询尝试分析查询字符串中的通配符术语。默认为false.

analyzer  (可选,string)用于将查询字符串中的文本转换为令牌的分析器。默认为default_field映射的索引时间分析器。如果没有映射分析程序,则使用索引的默认分析程序。

auto_generate_synonyms_phrase_query (可选,布尔值)如果true, 则为多术语同义词自动创建匹配短语查询。默认为true. 有关示例,请参阅同义词和query_string查询

boost (可选,浮点数)用于减少或增加查询相关性分数的浮点数 。默认为1.0.Boost 值相对于 的默认值1.00和之间的提升值会 1.0降低相关性分数。大于 的值会1.0 增加相关性分数。

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

  • OR (默认)

        例如,查询字符串capital of Hungary被解释为capital OR of OR Hungary

  • AND

        例如,查询字符串capital of Hungary被解释为capital AND of AND Hungary

enable_position_increments (可选,布尔值)如果true,则在从query_string搜索构造的查询中启用位置增量。默认为true.

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

您可以使用此参数查询来跨多个字段进行搜索。请参阅 搜索多个字段

fuzziness (可选,字符串)模糊匹配允许的最大编辑距离。有关模糊语法,请参阅Fuzziness

fuzzy_max_expansions (可选,整数)查询扩展到模糊匹配的最大术语数。默认为50.

fuzzy_prefix_length (可选,整数)用于模糊匹配的起始字符数保持不变。默认为0.

fuzzy_transpositions (可选,布尔值)如果true,模糊匹配的编辑包括两个相邻字符的换位(ab → ba)。默认为true.

lenient (可选,布尔值)如果,则忽略true基于格式的错误,例如为数字字段提供文本值。默认为false.

max_determinized_states (可选,整数) 查询所需的最大自动机状态数 。默认为10000

Elasticsearch 在内部使用Apache Lucene来解析正则表达式。Lucene 将每个正则表达式转换为包含多个确定状态的有限自动机。

您可以使用此参数来防止该转换无意中消耗过多资源。您可能需要增加此限制才能运行复杂的正则表达式。

minimum_should_match (可选,字符串)必须与要返回的文档匹配的最小子句数。有关有效值和更多信息,请参阅minimum_should_match 参数。请参阅 如何minimum_should_match工作的一个例子。

quote_analyzer  (可选,字符串)用于将查询字符串中引用的文本转换为令牌的分析器。默认为default_field映射的search_quote_analyzer。对于引用的文本,此参数将覆盖在分析器参数中指定的分析器。

phrase_slop (可选,整数)短语的匹配标记之间允许的最大位置数。默认为0. 如果0,则需要精确的短语匹配。转置项的斜率为2

quote_field_suffix (可选,字符串)查询字符串中引用文本的后缀。您可以使用此后缀对完全匹配使用不同的分析方法。请参阅将精确搜索与词干混合

rewrite (可选,字符串)用于重写查询的方法。有关有效值和更多信息,请参阅rewrite参数

time_zone (可选,字符串) 用于将查询字符串中的值转换为 UTC 的协调世界时 (UTC) 偏移量或 IANA 时区date

说明

query_string语法

查询字符串“mini-language”由query_string和搜索API中的q查询字符串参数使用.

查询字符串被解析为一系列术语和操作符。一个术语可以是一个单词(quick或brown),也可以是一个被双引号包围的短语("quick brown"),它以相同的顺序搜索短语中的所有单词。

操作符允许您自定义搜索-可用的选项解释如下。

字段名称

你可以在查询语法中指定要搜索的字段:

status 字段包含active:

status:active

title包含quick或者brown

title:(quick OR brown)

其中author字段包含确切的短语"john smith":

author:"John Smith"

其中first name字段包含Alice(注意我们需要用反斜杠转义空格) :

first\ name:Alice

book.title、book.content、book.date包含quick或brown

book.\*:(quick OR brown)

其中字段title有任何非空值: 

_exists_:title

 通配符

通配符搜索可以在单个术语上运行,?用于替换单个字符,以及*替换零个或多个字符:

qu?ck bro*

请注意通配符查询可能会使用大量的内存,并且执行得非常糟糕——只要想想需要查询多少项才能匹配查询字符串“a* b* c*”即可。

允许通配符出现在单词的开头(如“*ing”)是非常麻烦的,因为需要检查索引中的所有术语,以防它们匹配。可以通过将allow_leading_wildcard设置为false来禁用前导通配符。 

只有部分在字符级操作的分析链被应用。例如,如果分析器同时执行小写和词干化,那么只会应用小写:在一个缺少字母的单词上执行词干化是错误的。

通过将analyze_wildcard设置为true,将分析以*结尾的查询,并根据不同的标记构建布尔查询,确保第一个N-1标记的精确匹配,以及最后一个标记的前缀匹配。

正则表达式

正则表达式模式可以嵌入到查询字符串中,方法是用斜杠("/")括起来:

name:/joh?n(ath[oa]n)/

正则表达式语法中解释了支持的正则表达式语法。 

模糊

您可以使用运算符运行fuzzy查询~

quikc~ brwn~ foks~

对于这些查询,查询字符串是规范化的。如果存在,则仅应用分析器中的某些过滤器。有关适用过滤器的列表,请参阅Normalizers。 

该查询使用 Damerau-Levenshtein 距离 来查找最多有两个变化的所有术语,其中变化是单个字符的插入、删除或替换,或两个相邻字符的换位。

默认编辑距离2,但编辑距离1应该足以捕获 80% 的所有人类拼写错误。它可以指定为:

quikc~1

邻近查询

短语查询(例如“john smith”)期望所有的词汇都以完全相同的顺序出现,而接近查询允许指定的单词以更大的距离或不同的顺序出现。就像模糊查询可以指定单词中字符的最大编辑距离一样,接近搜索允许我们指定短语中单词的最大编辑距离: 

"fox quick"~5

字段中的文本越接近查询字符串中指定的原始顺序,就认为该文档越相关。与上面的示例查询相比,短语“quick fox”会被认为比“quick brown fox”更相关。 

范围

以为日期、数字或字符串字段指定范围。包含范围用方括号[min TO max]指定,排他范围用花括号{min TO max}指定。

  • 2012年的所有天:

    date:[2012-01-01 TO 2012-12-31]
  • 1-5的数字

    count:[1 TO 5]
  • alpha 和omega之间的标签,不包含 alpha 和omega:

    tag:{alpha TO omega}
  • 10以上

    count:[10 TO *]
  • 2012之前

    date:{* TO 2012-01-01}

大花括号和方括号可以组合使用: 

1-5不包含5:

count:[1 TO 5}

一侧无边界的范围可以使用以下语法:

age:>10
age:>=10
age:<10
age:<=10

 解析查询字符串中的范围可能很复杂,而且容易出错。使用显式范围查询要可靠得多。

增强

使用boost操作符^使一个术语比另一个术语更相关。例如,如果我们想找到所有关于fox的文档,但我们对quick fox特别感兴趣:

quick^2 fox

默认的boost值是1,但可以是任何正浮点数。0到1之间的增益降低相关性。

boost也可以用于短语或群体:

"john smith"^2   (foo bar)^4

布尔运算符

默认情况下,所有术语都是可选的,只要有一个术语匹配。搜索foo bar baz会找到任何包含一个或多个foo或bar或baz的文档。我们已经讨论了上面的default_operator,它允许您强制要求所有的条件,但也有布尔操作符可以在查询字符串本身中使用,以提供更多的控制。

首选操作符是+(必须存在此项)和-(必须不存在此项)。所有其他术语都是可选的。例如,下面的查询:

quick brown +fox -news

指出:

  • fox 必须在场
  • news 不得在场
  • quick并且brown是可选的——它们的存在增加了相关性

也支持常见的布尔运算符AND、OR和NOT(也包括&&、||和!),但要注意,它们不遵守通常的优先规则,所以当多个运算符一起使用时,应该使用括号。例如,前面的查询可以重写为:

((quick AND fox) OR (brown AND fox) OR fox) AND NOT news

相反,使用匹配查询重写的相同查询看起来像这样: 

{
    "bool": {
        "must":     { "match": "fox"         },
        "should":   { "match": "quick brown" },
        "must_not": { "match": "news"        }
    }
}

分组

多个术语或子句可以用括号组合在一起,形成子查询: 

(quick OR brown) AND fox

组可以用于针对特定字段,或用于提高子查询的结果: 

status:(active OR pending) title:(full text search)^2

 保留字符

如果您需要在查询本身中使用任何作为操作符的字符(而不是作为操作符),那么您应该在前面使用反斜杠对它们进行转义。例如,要搜索(1+1)=2,您需要将查询写成\(1\+1\)\=2。当使用JSON作为请求体时,前面两个反斜杠(\\)是必需的;反斜杠是JSON字符串中保留的转义字符

GET /my-index-000001/_search
{
  "query" : {
    "query_string" : {
      "query" : "kimchy\\!",
      "fields"  : ["user.id"]
    }
  }
}

保留字符是:+ - = && || > < !() {} [] ^ " ~ * ?: \ /

如果不能正确转义这些特殊字符,可能会导致语法错误,从而阻止您的查询运行。

空格和空字符串查询

空格不被认为是操作符。如果查询字符串为空或只包含空白空间,则查询将生成一个空结果集。

不可对嵌套文档查询

query_string搜索不返回嵌套文档。要搜索嵌套文档,请使用nestedquery

搜索多个字段

可以使用fields参数跨多个字段执行query_string搜索。

对多个字段运行query_string查询的思想是将每个查询项扩展为一个OR子句,像这样:

field1:query_term OR field2:query_term | ...

例如,以下查询 

GET /_search
{
  "query": {
    "query_string": {
      "fields": [ "content", "name" ],
      "query": "this AND that"
    }
  }
}

匹配相同的单词

GET /_search
{
  "query": {
    "query_string": {
      "query": "(content:this OR name:this) AND (content:that OR name:that)"
    }
  }
}

由于从单个搜索词生成多个查询,因此可以使用带tie_breaker的dis_max查询自动将它们组合起来。例如(name使用^5符号提升5):

GET /_search
{
  "query": {
    "query_string" : {
      "fields" : ["content", "name^5"],
      "query" : "this AND that OR thus",
      "tie_breaker" : 0
    }
  }
}

可以使用简单通配符搜索文档的“内部”特定元素。例如,如果我们有一个带有多个字段的city对象(或带有字段的内部对象),我们可以自动搜索所有的“city”字段:

GET /_search
{
  "query": {
    "query_string" : {
      "fields" : ["city.*"],
      "query" : "this AND that OR thus"
    }
  }
}

另一个选项是在查询字符串本身中提供通配符字段搜索(正确地转义*符号),例如:city.\*:something:

GET /_search
{
  "query": {
    "query_string" : {
      "query" : "city.\\*:(this AND that OR thus)"
    }
  }
}

fields参数还可以包含基于模式的字段名,允许自动扩展到相关字段(包括动态引入的字段)。例如:

GET /_search
{
  "query": {
    "query_string" : {
      "fields" : ["content", "name.*^5"],
      "query" : "this AND that OR thus"
    }
  }
}

多字段搜索的附加参数

query_string针对多个字段运行查询时,支持以下附加参数。

type

(可选,字符串)确定查询如何匹配和评分文档。有效值为:

best_fields (默认)

查找匹配任何字段并使用_score任何匹配字段中最高值的文档 。见 best_fields

bool_prefix

match_bool_prefix在每个字段上 创建一个查询并组合_score来自每个字段的 。见bool_prefix

cross_fields

将字段analyzer视为一个大字段。在任何字段中查找每个单词。见cross_fields

most_fields

查找与任何字段匹配的文档并组合_score来自每个字段的 。见most_fields

phrase

match_phrase对每个字段 运行查询并使用_score来自最佳字段的查询。见phrase和phrase_prefix

phrase_prefix

match_phrase_prefix对每个字段 运行查询并使用_score来自最佳字段的查询。见phrase和phrase_prefix

注意:其他顶级multi_match参数可能基于该type值可用 。

同义词和query_string查询

query_string查询支持使用synonym_graph令牌过滤器进行多术语同义词扩展。使用此筛选器时,解析器为每个多术语同义词创建一个短语查询。例如,以下同义词:ny,new york将产生:

(ny OR ("new york"))

也可以用连词来匹配多个同义词:

GET /_search
{
   "query": {
       "query_string" : {
           "default_field": "title",
           "query" : "ny city",
           "auto_generate_synonyms_phrase_query" : false
       }
   }
}

 上面的例子创建了一个布尔查询:

(ny OR (new AND york)) city

文件与术语ny或连词new AND york匹配。默认情况下,参数auto_generate_synonyms_phrase_query被设置为true。

minimum_should_match如何工作

query_string围绕每个操作符拆分查询,为整个输入创建一个布尔查询。您可以使用minimum_should_match来控制结果查询中应该匹配多少个“should”子句。

GET /_search
{
  "query": {
    "query_string": {
      "fields": [
        "title"
      ],
      "query": "this that thus",
      "minimum_should_match": 2
    }
  }
}

上面的例子创建了一个布尔查询:

(title:this title:that title:thus)~2

 它在单个字段标题中匹配具有至少两个this、That或thus术语的文档。

minimum_should_match在多字段查询中如何工作

GET /_search
{
  "query": {
    "query_string": {
      "fields": [
        "title",
        "content"
      ],
      "query": "this that thus",
      "minimum_should_match": 2
    }
  }
}

上面的例子创建了一个布尔查询:

((content:this content:that content:thus) | (title:this title:that title:thus))

在字段标题和内容上匹配具有分离Max的文档。这里不能应用minimum_should_match参数。 

GET /_search
{
  "query": {
    "query_string": {
      "fields": [
        "title",
        "content"
      ],
      "query": "this OR that OR thus",
      "minimum_should_match": 2
    }
  }
}

 添加显式操作符将强制将每一项视为单独的子句。

上面的例子创建了一个布尔查询:

((content:this | title:this) (content:that | title:that) (content:thus | title:thus))~2

它匹配三个“should”子句中的至少两个,每个子句都由每个术语的字段上的分离符Max组成。

 minimum_should_match在cross_field查询中如何工作

type字段中的cross_fields值表示在分析输入时将具有相同分析器的字段分组在一起。

GET /_search
{
  "query": {
    "query_string": {
      "fields": [
        "title",
        "content"
      ],
      "query": "this OR that OR thus",
      "type": "cross_fields",
      "minimum_should_match": 2
    }
  }
}

上面的例子创建了一个布尔查询:

(blended(terms:[field2:this, field1:this]) blended(terms:[field2:that, field1:that]) blended(terms:[field2:thus, field1:thus]))~2

 它将文档与三个每个术语混合查询中的至少两个匹配。

允许昂贵的查询

查询字符串查询可以在内部转换为前缀查询,这意味着如果禁用了前缀查询,就不会执行查询并抛出异常。

 类似资料: