
# text_search表函数
本文介绍text_search函数的语法规则，包括参数解释、函数示例等。text_search函数是云日志服务（LTS）提供的表函数，用于关键词检索日志数据。
#### 参数解释
该函数允许用户通过指定关键词查询条件，快速检索符合条件的日志记录，同时返回完整的表结构数据。
语法：text_search(index, query)
表1参数说明 
| 参数名称  | 描述                               | 类型      | 是否必选 |
|:---|:---|:---|:---|
| index | 索引名称（表名），指定要查询的日志流名称，当前默认值'log'。 | VARCHAR | 是    |
| query | 关键词查询语句，跟日志搜索语法相同。               | VARCHAR | 是    |
   
![](https://support.huaweicloud.com/usermanual-lts/public_sys-resources/note_3.0-zh-cn.png)
1. **索引名称**：index参数必须是'log'，暂不支持其他写法。
2. **查询语句**：query参数需遵循LTS日志搜索语法，语法错误会导致查询失败。
 
返回值：返回指定日志流对应的表结构，包含该表的所有列和日志搜索过滤后的数据行。
#### 示例1：基础关键词检索
查询包含 "error" 关键词的日志记录：
```
SELECT *  FROM table(text_search(index =>'log', query => 'error')) LIMIT 100
```
等同于如下方式：
```
error | SELECT * FROM log LIMIT 100
```
![](https://support.huaweicloud.com/usermanual-lts/public_sys-resources/note_3.0-zh-cn.png)
- index参数为'log'，表示查询当前日志流
- query参数为'error'，检索所有包含'error'关键词的日志。
- 返回该表的所有字段(如timestamp，level，message，host等)。
- 使用LIMIT 100限制返回结果数量，避免数据量过大。
 
**查询分析结果**
```
timestamp          | level  | message                        | host
---|---|---|------
2024-01-01 10:00:00| ERROR  | Connection timeout error       | host1
2024-01-01 11:30:00| ERROR  | Database connection failed     | host2
```
#### 示例2：join场景中使用
先从全量日志检索出所有日志级别为ERROR的trace_id，再从全量日志中找出包含这些trace_id的日志，只展示trace_id和message，最多返回1000条。
```
SELECT trace_id, message from log where trace_id in 
(SELECT distinct trace_id
FROM table(text_search(index =>'log', query =>  'level:ERROR')))
limit 1000
```
![](https://support.huaweicloud.com/usermanual-lts/public_sys-resources/note_3.0-zh-cn.png)
- query参数为 'level:ERROR'。
- in相当于join操作，等价 SELECT t.trace_id,t.message FROM log t INNER JOIN (SELECT DISTINCT trace_id FROM table(text_search(index =\>'log', query =\> 'level:ERROR'))) err ON t.trace_id=err.trace_id LIMIT 1000。
 
**查询分析结果**
```
trace_id  | message                        
---|--------------------------------
xxxx_xxxx1|   access memory
xxxx_xxxx1| Memory allocation failed
```
#### 示例3：关键词语法日志条数统计
分别统计不同关键词语法下的日志条数。
```
* | WITH method_log AS ( select count(*) as pv from table(text_search(index =>'log', query => 'method : GET'))) , 
content_log AS ( select count(*) as pv2 from table(text_search(index =>'log', query => 'content'))) ,
status_log AS ( select count(*) as pv3 from table(text_search(index =>'log', query => 'status : 200'))) 
SELECT pv,pv2,pv3 from method_log LEFT JOIN content_log ON 1 = 1 LEFT JOIN status_log ON 1 = 1
```
![](https://support.huaweicloud.com/usermanual-lts/public_sys-resources/note_3.0-zh-cn.png)
- index参数为固定用法，当前仅支持写为log，表示查询当前日志流的数据。后续会支持使用指定日志流名称或日志流id的用法，用于实现跨流联查，敬请期待。
- query参数后面的参数'status : 200'是关键词查询语法。
 
**查询分析结果**
```
pv           pv2          pv3
3235207      2185395      14334124
```
#### 性能优化建议
1. 限制结果数量：使用LIMIT子句避免返回过多数据。
   ```
   SELECT * FROM Table(text_search(index =>'log', query =>  'level:ERROR')) LIMIT 1000;
   ```
   
2. 精确字段选择：只选择需要的字段，减少数据传输。
   ```
   SELECT message FROM Table(text_search(index =>'log', query =>  'ERROR'));
   ```
   
3. 优化查询条件：使用Lucene语法进行预筛选，减少后端处理压力。
   ```
   -- 使用字段匹配而非全文检索
   text_search(index =>'log', query =>  'level:ERROR')  -- 高效
   text_search(index =>'log', query =>  'ERROR')        -- 较慢(全文扫描)
   ```
   
 
