
# 搜索语法介绍
云日志服务LTS提供一套搜索语法用于设置搜索条件，帮助您更有效地搜索日志。
查询语句用来指定日志查询时的过滤规则，返回符合条件的日志。根据索引配置方式可分为全文查询和字段查询，根据查询精确程度可分为精确查询和模糊查询。详细请参考[表1]。
SQL是用于访问和处理数据库的标准计算机语言。管道符提供了使用SQL语句进行数据分析的能力，具体请参考SQL92语法标准。
使用SQL语句进行查询时，建议SQL语句中的字段名或别名使用双引号，例如：select "field1.a" as "别名" from log。
 表1查询方式 
| 查询方式 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 示例                                                       |
|:---|:---|:---|
| 全文查询 | 配置全文索引后，日志服务根据您设置的分词符将整条日志拆分成多个词。您可以指定关键字（字段名、字段值）和查询规则进行查询。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | hello and world表示查询同时包含关键字hello和world的日志。                |
| 字段查询 | 配置字段索引后，您可以指定字段名称和字段值（Key:Value）进行查询。根据字段索引中设置的数据类型，您可以进行多种类型的基础查询和组合查询。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | time\>60 and region:r\*表示查询time字段值大于60且region字段值以r开头的日志。 |
| 精确查询 | 使用完整的词进行查询。日志服务查询采用的是分词法，精确查询时并不能完全匹配关键词。例如查询语句为abc def，查询结果将包含所有abc和def的日志，无法完全匹配目标短语。如果您要完全匹配短语abc def，可以使用短语查询。更多信息，请参见短语查询、如何精准查询日志。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | region:r1表示查询region字段值精确匹配r1的日志。                         |
| 模糊查询 | 在查询语句中指定一个64个字符以内的词，在词的中间或者末尾加上模糊查询关键字，即星号（\*）或问号（?），日志服务会在所有日志中为您查询到符合条件的100个词，返回包含这100个词并满足查询条件的所有日志。指定的词越精确，查询结果越精确。 - 星号（\*）代表匹配多个字符，问号（?）代表匹配1个字符。  - 当星号（\*）和问号（?）作为分词符时，不具备模糊搜索功能，其中问号（?）为默认的分词符，使用其模糊搜索功能前需将其从分词符中移除。  - 星号（\*）或问号（?）不能用在词的开头。  - long数据类型和float数据类型不支持使用星号（\*）或问号（?）进行模糊搜索。  - 当模糊条件前缀很短且日志中符合条件的词超过100个时，查询结果会不精确。   | my\*表示在所有日志中查找以my开头的100个词，并返回包含这些词的日志。                   |
   
- **分词符**
  云日志服务LTS会根据分词符，将日志内容拆分成多个词。日志服务默认配置的分词符为**, '";=()\[\]{}@\&\<\>/:\\\\?\\n\\t\\r**。
  例如：日志**2023-01-01 09:30:00** ，默认分词符会将其分为四部分：**2023-01-01、09、30、00**。
  此时搜索语句**2023** 无法匹配到该条日志，可以通过**2023-01\*** 或**2023-01-01**搜索到该条日志。
  如果设置分词符为空，则字段值将被当成一个整体，您只能通过完整日志内容或模糊搜索查找对应的日志。
  
- **关键词顺序**
  只有短语搜索**#"abc def"**才能保证关键词出现的顺序，其他搜索方式多个关键词默认AND连接。
  例如：**request_method:GET POST**查询的是同时包含GET和POST的日志，不会保证GET和POST的顺序。如有需要推荐采用短语搜索。
  
- **中文搜索**
  中文搜索时不需要采用模糊查询，如有需要推荐采用短语搜索，可以匹配到更精确的结果。
  云日志服务LTS的英文是以单词的形式进行拆分的，单词的长度不一致，因此可以通过模糊搜索匹配拥有相同前缀英文单词的日志。
  中文采用的是一元分词，每个字都是独立的，拆分后每部分的长度都是1。
  例如：搜索语句**星期一** ，代表搜索同时包含**星** 、**期** 、**一** 的日志；搜索语句**#"星期一"** ，代表搜索包含目标短语**星期一**的日志。
  
- **语法关键词**
  日志搜索语句的语法关键词包括：\&\& \|\| AND OR and or NOT not in : \> \< = ( ) \[ \]
  其中**and AND or OR NOT not in**作为语法关键词使用时，前后需要使用空格分隔；
  如果日志中本身包含语法关键词且需要搜索时，搜索语句需要用**双引号**包裹，否则可能会导致语法错误或搜索到错误的结果。
  例如：搜索语句**content:and** ，包含语法关键词**and** ，需要修改为**content:"and"**。
  
#### 短语搜索
短语搜索用于准确匹配目标短语，例如搜索语句**abc def** ，不区分先后顺序，将匹配所有同时包含**abc** 和**def** 的日志。短语搜索和关键词搜索的区别请参考[表2]。
- **短语搜索**：在关键词搜索语法的基础上实现，短语搜索能够区分关键词的顺序，用于精准匹配目标短语，搜索结果更加精确。短语搜索适用于英文短语、中文短语的搜索，不支持模糊搜索。
- **关键词搜索** ：关键词搜索是基于分词实现，通过分词符先将搜索内容拆分为多个关键词，然后匹配日志。关键词搜索不会区分多个关键词在日志中出现的顺序，因此只要日志中按照搜索的与或非逻辑能命中关键词，该日志就会被搜索到。
   表2搜索区别 
  | 搜索方式 | 短语搜索                          | 关键词搜索                    |
  |:---|:---|:---|
  | 搜索区别 | 区分关键词的顺序，用于精准匹配目标短语，搜索结果更加精确。 | 不区分关键词的顺序，按照搜索逻辑命中关键词即可。 |
  | 举例说明 | 假设您的日志流中存在2条原始日志，如下： - 原始日志1：this service is lts  - 原始日志2：lts is service   ||
  | 举例说明 | 短语搜索：#"is lts"，会命中1条日志。       | 关键词搜索：is lts，会命中2条日志。    |
  | 举例说明 | 短语搜索：#"lts is"，会命中1条日志。       | 关键词搜索：lts is，会命中2条日志。    |
     
  表3搜索方式 
  | 搜索方式 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                 |
  |:---|:---|
  | 全文搜索 | - #"abc def"  - content:#"abc def"   content为日志原文对应的内置字段，**#"abc def"** 等同于**content:#"abc def"**，默认匹配日志原文的内容。 |
  | 字段搜索 | key:#"abc def" - value参数不可为空。  - 字段搜索和not运算符配合使用时，还会匹配到不包含该字段的日志。                                                                                                                                           |
     
  - 短语搜索不支持搭配模糊搜索。 短语搜索中的星号（\*）和问号（?）会被视为普通字符，因此短语搜索不支持搭配模糊搜索，可以用来搜索日志中的星号（\*）和问号（?）。
    
  
  
  
  - 短语搜索不支持对分词符进行搜索。 例如搜索语句**#"var/log"** ，其中 / 为分词符，搜索语句等同于**#"var log"** ，会搜索包含目标短语**var log** 的日志。同理，搜索语句**#"var:log"** 、**#"var;log"** 等搜索的也是包含目标短语**var log**的日志。
    
  
  - 中文搜索推荐采用短语搜索。 由于中文默认采用的是一元分词，每个汉字单独分词，搜索时会匹配同时包含搜索语句中每一个汉字的日志，本身便具有模糊搜索的特性，当需要更加精确的结果时，推荐采用短语搜索。
    
   
 
#### 运算符
查询语句支持如下[运算符]。
 表4运算符 
| 运算符 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 示例                                                                                                                                                                                                                  |
|:---|:---|:---|
| and | and运算符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | request_method:GET and status:200                                                                                                                                                                                   |
| AND | 与运算符，等同于and。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | request_method:GET AND status:200                                                                                                                                                                                   |
| or  | or运算符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | request_method:GET or status:200                                                                                                                                                                                    |
| OR  | 或运算符，等同于or。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | request_method:GET OR status:200                                                                                                                                                                                    |
| not | not运算符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | - request_method:GET not status:200  - not status:200           |
| ( ) | 用于提高括号内查询条件的优先级。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | (request_method:GET or request_method:POST) and status:200                                                                                                                                                          |
| :   | 用于字段查询（Key:Value）。 如果字段名称（key）或者字段值（value）内有空格或冒号（:）等保留字符，请使用双引号（""）包裹字段名称（key）或者字段值（value）。例如： - "request method":GET  - message:"This is a log"  - time:"09:00:00"  - ipv6:"2024:AC8:2ac::d09"   | request_method:GET                                                                                                                                                                                                  |
| ""  | 使用双引号（""）包裹一个语法关键词，可以将该语法关键词转换成普通字符。例如"and"表示查询包含and的日志，此处的and不代表运算符。在字段查询中双引号（""）内的所有词被当成一个整体。                                                                                                                                                                                                                                                                                                                                                                                                                                                        | request_method:"GET"                                                                                                                                                                                                |
| \\  | 转义符号，用于转义双引号（""），转义后的引号表示符号本身。 转义双引号\\"在搜索语句中必须成对出现。例如支持使用fieldName : "\\"error\\""或fieldName:"\\\\"，不支持使用fieldName : "error\\""或者fieldName : "error\\"                                                                                                                                                                                                                                                                                                                                                                | 例如日志内容为instance_id:nginx"01"，您可以使用instance_id:nginx\\"01\\"进行查询。                                                                                                                                                    |
| \*  | 通配符查询，匹配零个、单个、多个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | host:ecs\*c                                                                                                                                                                                                         |
| ?   | 通配符查询，匹配单个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | host:ecs?c                                                                                                                                                                                                          |
| \>  | 查询某字段值大于某数值的日志。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | request_time\>100                                                                                                                                                                                                   |
| \>= | 查询某字段值大于或等于某数值的日志。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | request_time\>=100                                                                                                                                                                                                  |
| \<  | 查询某字段值小于某数值的日志。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | request_time\<100                                                                                                                                                                                                   |
| \<= | 查询某字段值小于或等于某数值的日志。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | request_time\<=100                                                                                                                                                                                                  |
| =   | 查询某字段值等于某数值的日志。针对double、long类型的字段，等号（=）和冒号（:）作用相同。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 例如request_time=100等同于request_time:100。                                                                                                                                                                              |
| in  | 查询某字段值处于某数值范围内的日志，中括号表示闭区间，小括号表示开区间，两个数字之间使用空格分隔。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | - request_time in \[100 200\]  - request_time in (100 200\]   |
| #"" | 用于搜索包含目标短语的日志，可以保证关键词出现的顺序。 短语搜索中的星号（\*）和问号（?）会被视为普通字符，因此短语搜索不支持模糊搜索，可以用来搜索日志中的星号（\*）和问号（?）。                                                                                                                                                                                                                                                                                                                                                                                                | request_method:#"GET POST"                                                                                                                                                                                          |
   
#### 示例说明
![](https://support.huaweicloud.com/usermanual-lts/zh-cn_image_0000002065281857.png "点击放大")
表5搜索说明 
| 搜索需求                                    | 搜索语句                           |
|:---|:---|
| 搜索User-Agent字段值包含短语Mon, 17 Apr 2023的日志。 | User-Agent:#"Mon, 17 Apr 2023" |
| 搜索User-Agent字段值包含短语Mozilla/5.0的日志。      | User-Agent:#"Mozilla/5.0"      |
| 搜索week字段值包含短语星期一的日志。                    | week:#"星期一"                    |
   
