## 检索方式

开启全文检索或者为字段配置索引之后，可以进行全文检索，或指定字段名称和字段内容进行检索。</br>
> 注：系统采集的stream和tag标签字段不可进行全文检索，需要配置键值索引后进行字段检索

检索语法关键字是 match，检索语句写在 match 关键字之后，和 match 关键字之间通过空格分隔。形如：
`match 检索语句`

### 支持的查询类型：

* **数值查询**：指定字段和查询条件，所指定字段符合条件的日志会作为结果返回。例如 `match status=200 and time_cost in [100 200)` 表示查询 status 等于 200 且 time_cost 大于等于 100 且 time_cost 小于 200 的日志。
* **关键字查询**：指定字段和关键字，所指定字段包含该关键字的日志会作为结果返回。如果不指定字段，将对日志原文进行查询。如果需要查询的关键字中包含检索语法运算符或空格，可以将关键字用双引号（""）包裹，表示将双引号中的内容作为多个关键字查询。例如 `match method:GET and msg:"service not avaliable"` 表示查询 method 是 GET 并且 msg 包含关键字 service、not 和 avaliable 的日志，等价于查询 `match method:GET and msg:service and msg:"not" and msg:avaliable`。
* **短语查询**：如果需要查询特定的关键字组合，可以将关键字用单引号('')包裹作为短语，表示按照单引号中的关键字顺序进行匹配查询。如果不指定字段，将对日志原文进行查询。例如 `match msg:'service not avaliable'` 表示查询 msg 包含短语 service not avaliable 的日志，且组成短语的关键字之前不包括其他关键字, service is temporarily not avaliable 和 not service avaliable 都不会命中查询。
>限制说明
* 短语查询不支持模糊搜索,短语查询里的模糊查询关键字 * ?会被当做字符常量处理。
* 翻页：日志服务每次翻页执行一次短语查询，短语查询每次最多查询10,000条日志，在翻页过程中（每页20条），可能出现某页中显示的日志数量少于20条，但仍可向下滚动翻页的情况；例如日志总数为20,000条，当您执行一次短语查询后，只返回18条且向后翻页功能可用，此时说明前10,000条日志中只有18条日志满足短语查询条件。您可以执行翻页操作，日志服务会自动在后10,000条日志中，执行第二次短语查询，并返回符合条件的日志。
* **模糊查询**：在关键字中的中间或末尾加上模糊查询关键字，即 \* 和 ?（其中\*可匹配任意个字符，?只可匹配单个字符 ），日志服务会在所有日志中为您查询符合条件的日志。例如 match http_user_agent:andr\* 表示在所有日志中查找 http_user_agent 字段包含以 andr 开头的词的日志。

  >限制说明：
    * 查询时必须指定前缀，即 * 和 ? 不能出现在词的开头。
    * 指定的词越精确，查询结果越精确。

### 字段对应的查询类型

* 对于 text 类型的字段，可以进行普通查询、短语查询、模糊查询。
* 对于 float 和 long 类型的字段，可以指定数值范围进行查询。


例如，查询语句为 `match method:GET and status >= 500`，表示查询 method 字段值是 GET，且 status 字段值大于等于 500 的日志。


## 运算符
<BR/>

| 运算符 | 说明 |
| ---- | ---- |
| and | and运算符。格式为 query1 and query2，表示 query1 和 query2 查询结果的交集。如果多个单词间没有语法关键词，默认是 and 的关系。 |
| or | or运算符。格式为 query1 or query2，表示 query1 和 query2 查询结果的并集。 |
| not | not运算符。格式为 query1 not query2，那么表示符合 query1 但不符合 query2 的结果，即 query1 - query2。如果省略 query1 ，只有 not query2 ，表示从全部日志中选取不包含 query2 的结果。 |
| () | 括号用于把一个或多个子查询合并成一个查询条件，用于提高括号内查询条件的优先级。 |
| : | 用于 key-value 对的查询。key:term 构成一个 key-value 对。表示在 key 的索引上执行 term 查询。如果 key 或者 value 内有空格，冒号 : 等字符，需要用双引号 "" 把整个 key 或者 value 包裹起来。左右引号内部的任何一个 term 都会被查询，而不会当成语法关键词。 |
| \* | 模糊查询关键字，用于替代 0 个或多个字符，例如：andr\*，会返回 andr 开头的所有命中词。 |
| ? | 模糊查询关键字，用于替代一个字符，例如 andr?id，会返回以 andr 开头，以 id 结尾，并且中间还有一个字符的所有命中的词。 |
|" "| 使用""包裹一个语法关键词，可以将该语法关键词转换成普通字符。在字段查询中""内的所有词被当成一个整体。 例如 match msg:"service not avaliable" 将把not关键词当成普通字符，表示查询 msg 包含 service、not 和 avaliable 的日志；双引号查询里的*，？代表模糊查询|
|' '| 表示短语检索。左右引号内部的内容会被当做一个关键字短语进行短语查询，表示按照单引号中的关键字顺序进行匹配查询。单引号内的模糊查询关键字* ？会当做常量处理|
| \\ | 转义符，用于转义: \' " \*？> = < ( )[ ] \n \r等，转义后的符合表示符号本身，例如key1的字段值包含双引号abc"def，则可增加转义符进行检索key1:abc\\"def。</br>用双引号进行检索时，仅需转义"\*？\n \r \t，未转义的\*和？代表模糊检索</br>用单引号进行检索时，仅需转义'\*？\n \r \t，未转义的\*和？当做常量处理|
| > | 查询某个字段下大于某个数值的日志，例如 status > 500。 |
| >= | 查询某个字段下大于或等于某个数值的日志，例如 status >= 500。 |
| < | 查询某个字段下小于某个数值的日志，例如 status < 400。 |
| <= | 查询某个字段下小于或等于某个数值的日志，例如 status <= 400。 |
| = | 查询某个字段下等于某个数值的日志，例如 status = 404。 |
| in | 查询某个字段处于某个范围内的日志，使用中括号表示闭区间，使用小括号表示开区间，括号中间使用两个数字，数字中间为若干个空格。例如 status in \[500 600\] 或 status in \[200 400)。 |
| is null| 查询某个字段值为空或不包含该字段的日志。例如 error is null。 |
| is not null| 查询某个字段值不为空的日志。例如 error is not null。 |
| is true | 查询某个布尔类型的字段值为 true 的日志，例如 success is true。 |
| is false| 查询某个布尔类型的字段值为 false 的日志，例如 success is false。 |
| is not true| 查询某个布尔类型字段值不为 true 的日志。需要注意，若字段内容为空或日志中没有该字段，则默认字段值为null，满足字段值不为 true 的条件。例如 success is not true。如果需要查询有 success 字段，且值不为 true 的日志，可以使用 success is not null and success is not true 进行查询。 |
| is not false| 查询某个布尔类型字段值不为 false 的日志。需要注意，若字段内容为空或日志中没有该字段，则默认字段值为null，满足字段值不为 false 的条件。例如 success is not false。 |
| \| | 管道运算符，用于分隔检索语法和 SQL 语法，表示在检索的基础上进行更多计算，例如 match query1 \| select count(\*)。 |
