# (Query String Query) 未完成

## 查询语句查询

使用查询解析器为了解析其内容的查询。 这里是一个例子：

```
GET /_search
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "this AND that OR thus"
        }
    }
}
```

query\_string以下几个重要参数：

| 参数                             | 描述                                                                                                     |
| ------------------------------ | ------------------------------------------------------------------------------------------------------ |
| `query`                        | 要解析的实际查询。 请参阅查询字符串语法。                                                                                  |
| `default_field`                | 如果未指定前缀字段，则为查询字词的默认字段。 默认为index.query.default\_field索引设置，默认为\_all。                                     |
| `default_operator`             | 如果未指定显式运算符，则使用默认运算符。 例如，使用OR的默认运算符，匈牙利的查询资本将转换为OR匈牙利的资本OR，如果使用默认运算符AND，则相同的查询将转换为AND匈牙利的资本AND。 默认值为OR。 |
| `analyzer`                     | 用于分析查询字符串的分析器名称。                                                                                       |
| `allow_leading_wildcard`       | 设置时，\*或？ 被允许作为第一个字符。 默认为true。                                                                          |
| `lowercase_expanded_terms`     | 通配符，前缀，模糊和范围查询的条件是否自动降低或不降低（因为它们没有被分析）。 默认为true。                                                       |
| `enable_position_increments`   | 设置为true可在结果查询中启用位置增量。 默认为true。                                                                         |
| `fuzzy_max_expansions`         | 控制模糊查询将扩展到的术语数。 默认值为50                                                                                 |
| `fuzziness`                    | 设置模糊查询的模糊性。 默认为AUTO。 有关允许的设置，请参阅“Fuzzinessedit”一节.                                                     |
| `fuzzy_prefix_length`          | 设置模糊查询的前缀长度。 默认值为0。                                                                                    |
| `phrase_slop`                  | 设置短语的默认斜率。 如果为零，则需要精确的短语匹配。 默认值为0。                                                                     |
| `boost`                        | 设置查询的提升值。 默认为1.0。                                                                                      |
| `analyze_wildcard`             | 默认情况下，不分析查询字符串中的通配符术语。 将此值设置为true，将尽力分析这些值。                                                            |
| `auto_generate_phrase_queries` | 默认False                                                                                                |
| `max_determinized_states`      | 限制允许创建多少个自动机状态regexp查询。 这防止了太难的（例如指数级的）正则表达式。 默认为10000。                                                |
| `minimum_should_match`         | 一个值，用于控制在生成的布尔查询中应该匹配多少个“应该”子句。 它可以是绝对值（2），百分比（30％）或两者的组合。                                             |
| `lenient`                      | 如果设置为true将导致基于格式的失败（例如向数字字段提供文本）被忽略。                                                                   |
| `locale`                       | 应用于字符串转换的区域设置。 默认为ROOT。                                                                                |
| `time_zone`                    | 要应用于与日期相关的任何范围查询的时区。 另请参阅JODA时区。                                                                       |

当生成多项查询时，可以控制如何使用rewrite参数重写它。

## 默认字段： <a href="#id-cha-xun-yu-ju-cha-xun-mo-ren-zi-duan" id="id-cha-xun-yu-ju-cha-xun-mo-ren-zi-duan"></a>

当未在查询字符串语法中显式指定要搜索的字段时，将使用index.query.default\_field来导出要搜索的字段。 它默认为\_all字段。

因此，如果\_all字段被禁用，可能有必要更改它以设置不同的默认字段。

## 多个字段： <a href="#id-cha-xun-yu-ju-cha-xun-duo-ge-zi-duan" id="id-cha-xun-yu-ju-cha-xun-duo-ge-zi-duan"></a>

query\_string查询也可以针对多个字段运行。 字段可以通过“fields”参数提供（如下例所示）。

对多个字段运行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)"
        }
    }
}
```

由于从单个搜索项生成了几个查询，因此可以使用dis\_max查询或简单的bool查询自动完成组合。 例如（使用^ 5表示法将名称提升5）：

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

简单通配符也可以用于搜索文档的“内部”特定内部元素。 例如，如果我们有一个城市对象与多个字段（或内部对象与字段）在其中，我们可以自动搜索所有“城市”字段：

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

另一个选项是在查询字符串本身中提供通配符字段搜索（正确转义\*符号），例如：city。 \*：something。

对多个字段运行query\_string查询时，允许以下附加参数：

| 参数            | 描述                                                   |
| ------------- | ---------------------------------------------------- |
| `use_dis_max` | 应该使用dis\_max（设置为true）或bool查询（设置为false）组合查询。 默认为true。 |
| `tie_breaker` | 当使用dis\_max时，断开最大断路器。 默认值为0。                         |

fields参数还可以包括基于模式的字段名称，允许自动扩展到相关字段（包括动态引入的字段）。 例如：

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

## 查询字符串语法

查询字符串“迷你语言”由查询字符串查询和查询API中的q查询字符串参数使用。

查询字符串被解析为一系列的术语和运算符。 术语可以是单个词 - quick 或brown 或一个短语，用双引号括起来 - “quick brown” - 以相同的顺序搜索短语中的所有单词。

操作员允许您自定义搜索 - 可用选项如下所述。

### 字段名称

如查询字符串查询中所述，搜索default\_field是为了搜索搜索词，但可以在查询语法中指定其他字段

如在status字段内包含active

```
status:active
```

以下表示标题字段包含快速或棕色。 如果省略OR运算符，将使用默认运算符

```
title:(quick OR brown)
title:(quick brown)
```

以下表示作者字段包含确切的短语“john smith”

```
author:"John Smith"
```

表示包含任何字段book.title，book.content或book.date包含quick或brown（注意我们如何需要用反斜杠转义\*）

```
book.\*:(quick brown)
```

以下表示字段标题具有任何非空值

```
_exists_:title
```

### 通配符

通配符搜索可以使用单个术语运行？ 替换单个字符，\*替换零个或多个字符：

```
qu?ck bro*
```

请注意，通配符查询会使用大量的内存并且执行得效率非常慢 - 只需考虑需要查询多少条件来匹配查询字符串“a \* b \* c \*”

> 在字的开头允许通配符（例如“\* ing”）特别耗性能，因为索引中的所有项都需要检查，以防它们匹配。 可以通过将allow\_leading\_wildcard设置为false来禁用主导通配符。

默认情况下不会分析通配字词 - 它们是小写的（lowercase\_expanded\_terms默认为true），但不进行进一步的分析，主要是因为无法准确分析缺少某些字母的单词。

但是，通过将analyze\_wildcard设置为true，将尝试在搜索术语列表以匹配术语之前分析通配字。

### 正则表达式

正则表达式模式可以通过以正斜线（“/”）包裹在查询字符串中来嵌入：

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

说明了正则表达式语法中受支持的正则表达式语法。

> allow\_leading\_wildcard参数对正则表达式没有任何控制。 诸如以下的查询字符串将强制Elasticsearch访问索引中的每个术语：
>
> ```
> /.*n/
> ```
>
> 要谨慎使用。

### 模糊性

我们可以使用“fuzzy”运算符搜索与我们的搜索字词类似但不完全相似的字词：

```
quikc~ brwn~ foks~
```

这使用Damerau-Levenshtein距离找到所有最多只有两个变化的术语，其中一个变化是单个字符的插入，删除或替换，或两个相邻字符的变换。

默认编辑距离为2，但编辑距离为1应足以捕获所有人为拼写错误的80％。 它可以指定为：

```
quikc~1
```

### 邻近搜索

虽然短语查询（例如“john smith”）期望所有的词语具有完全相同的顺序，但是邻近查询允许指定的词语更远或者以不同的顺序。

以相同的方式，模糊查询可以指定单词中的字符的最大编辑距离，接近搜索允许我们指定短语中的单词的最大编辑距离：

```
"fox quick"~5
```

字段中的文本越接近查询字符串中指定的原始顺序，文档则被认为是相关。 与上述示例查询相比，短语“quick fox”将被认为比“quick brown fox”更相关。

## 范围 <a href="#id-cha-xun-yu-ju-cha-xun-fan-wei" id="id-cha-xun-yu-ju-cha-xun-fan-wei"></a>

可以为日期，数字或字符串字段指定范围。 包含的范围使用方括号\[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}
```

数字1到无群大

```
count:[10 TO *]
```

日期：2012你年以前

```
date:{* TO 2012-01-01}
```

大块好和方括号可以组合使用

数字1到5但不包含5

```
count:[1 TO 5}
```

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

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

> 要将上限和下限与简化的语法组合，您需要使用AND运算符连接两个子句：
>
> ```
> age:(>=10 AND <20)
> age:(+>=10 +<20)
> ```

查询字符串中范围的解析可能很复杂并且容易出错。 使用显式范围查询是更可靠的。

### 特殊字符

使用boost运算符^使一个术语比另一个更相关。 例如，如果我们想查找关于狐狸的所有文档，但我们对快速狐狸特别感兴趣：

```
quick^2 fox
```

默认提升值为1，但可以是任何正浮点数。 在0和1之间升高降低相关性。

提升也可以应用于短语或组：

```
"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（也写为&&，||和！）。

然而，这些操作符的效果可能比第一眼明显的复杂。

NOT优先于AND，优先于OR。 而+和 - 只影响运算符右边的项，AND和OR可以影响左边和右边的项。

> 使用AND，OR和NOT重写上述查询表明复杂性：
>
> quick OR brown AND fox AND NOT news
>
> 这是不正确的，因为brown现在是必需的术语。
>
> (quick OR brown) AND fox AND NOT news
>
> 这是不正确的，因为现在需要快速或棕色中的至少一个，并且对这些术语的搜索将与原始查询不同地打分。
>
> ((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。

保留字符为：+ - = && || ><！ （）{} \[] ^“〜\*？： /

无法正确转义这些特殊字符可能会导致语法错误，阻止您的查询运行。

> 请看这里：
>
> 空格也可以是保留字符。 例如，如果你有一个同义词列表将“wi fi”转换为“wifi”，query\_string搜索“wi fi”将失败。
>
> 查询字符串解析器会将您的查询解释为搜索“wi OR fi”，而存储在索引中的条件实际上是“wifi”。
>
> 转义空格将保护它不被查询字符串解析器，如：“wi  fi”。

### 空查询

如果查询字符串为空或仅包含空格，则查询将生成空结果集。
