# Lucene 语法使用方法 ## Lucene 简介 Lucene 是 Apache 软件基金会 4 jakarta 项目组的一个子项目,是一个开放源代码的全文检索引擎工具包。 Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。 ## Lucene 语法 Lucene 的语法搜索格式允许您以灵活的方式构建搜索查询,以满足不同的搜索需求。以下是 Lucene 的语法搜索格式的详细说明: ### 关键字查询 要通过 Lucene 语法实现多个关键字的查询,您可以使用布尔逻辑操作符来组合多个关键字。Lucene 支持以下几种操作符: 1. AND 操作符 - 使用  __AND__  或  __&&__  来表示逻辑与关系。 - 例如: __term1 AND term2__  或  __term1 && term2__ 2. OR 操作符 - 使用  __OR__  或  __||__  来表示逻辑或关系。 - 例如: __term1 OR term2__  或  __term1 || term2__ 3. NOT 操作符 - 使用  __NOT__  或 `` 来表示逻辑非关系。 - 例如: __term1 NOT term2__  或  __term1 -term2__ 4. 引号 - 您可以将一个短语括在引号中以进行精确匹配。 - 例如: __"exact phrase"__ #### 举例 1. 指定字段 ```lucene field1:keyword1 AND (field2:keyword2 OR field3:keyword3) NOT field4:keyword4 ``` 解释如下: - 查询字段  __field1__  必须包含关键字  __keyword1__ 。 - 同时,字段  __field2__  必须包含关键字  __keyword2__  或字段  __field3__  必须包含关键字  __keyword3__ 。 - 最后,字段  __field4__  不得包含关键字  __keyword4__ 。 2. 不指定字段 ```lucene keyword1 AND (keyword2 OR keyword3) NOT keyword4 ``` 解释如下: - 查询关键字  __keyword1__  必须存在于任意可搜索的字段中。 - 同时,关键字  __keyword2__  必须存在或关键字  __keyword3__  必须存在于任意可搜索的字段中。 - 最后,关键字  __keyword4__  不得存在于任意可搜索的字段中。 ### 模糊查询 在 Lucene 中,模糊查询可以通过波浪号 __~__ 来实现近似匹配。您可以指定一个编辑距离来限制匹配的相似度程度。 ```lucene term~ ``` 在上述示例中, __term__ 是要进行模糊匹配的关键字。 请注意以下几点: - 波浪号  __~__  后面可以指定一个可选的参数,用于控制模糊查询的相似度。 - 参数值范围为 0 到 2 之间,其中 0 表示完全匹配,1 表示一次编辑操作(如增加、删除或替换字符)内可以匹配,2 表示两次编辑操作内可以匹配。 - 如果不指定参数值,默认使用 0.5 作为相似度阈值。 - 模糊查询将返回与给定关键字相似的文档,但会有一定的性能开销,特别是对于较大的索引。 ### 通配符 Lucene 支持以下两种通配符查询: 1. `*` 通配符: `*` 用于匹配零个或多个字符。 例如, __te*t__  可以匹配 "test"、"text"、"tempest" 等。 2. `?` 通配符: `?` 用于匹配单个字符。 例如, __te?t__  可以匹配 "test"、"text" 等。 #### 举例说明 ```lucene te?t ``` 在上述示例中, __te?t__ 表示匹配以 "te" 开头,接着是一个任意字符,然后以 "t" 结尾的词。这种查询可以匹配例如 "test"、"text"、"tent" 等。 需要注意的是,问号只能代表一个字符,如果想要匹配多个字符或者是可变长度的字符,可以使用星号 `*` 进行多字符通配符匹配。 另外,问号不会匹配空字符串。 总结一下,Lucene 语法中的问号 `?` 用作单字符通配符,表示匹配任意一个字符。通过在搜索关键字中使用问号,您可以进行更灵活和具体的模式匹配。 ### 范围查询 Lucene 语法支持范围查询,您可以使用方括号 __[ ]__ 或花括号 __{ }__ 来表示范围。以下是范围查询的示例: 1. 包含边界的范围查询: - 方括号  __[ ]__  表示闭区间,包含边界值。 - 例如: __field:[value1 TO value2]__  表示  __field__  的取值范围从  __value1__  到  __value2__ (包含两者)。 2. 排除边界的范围查询: - 花括号  __{ }__  表示开区间,排除边界值。 - 例如: __field:{value1 TO value2}__  表示  __field__  的取值范围在  __value1__  和  __value2__  之间(不包含两者)。 3. 省略边界的范围查询: - 可以省略一个或两个边界值来指定无限范围。 - 例如: __field:[value TO ]__  表示  __field__  的取值范围从  __value__  到正无穷, __field:[ TO value]__  表示  __field__  的取值范围从负无穷到  __value__ 。 !!! note 请注意,范围查询只适用于能够进行排序的字段类型,如数字、日期等。同时,确保在查询时将边界值正确地指定为字段的实际值类型。 如果您希望在整个索引中进行范围查询而不指定特定字段,可以使用通配符查询 `*` 来代替字段名。 #### 举例说明 1. 指定字段 ```lucene timestamp:[2022-01-01 TO 2022-01-31] ``` 这将检索 __timestamp__ 字段在 2022 年 1 月 1 日到 2022 年 1 月 31 日之间的数据。 2. 不指定字段 ```lucene *:[value1 TO value2] ``` 这将在整个索引中搜索取值范围从 __value1__ 到 __value2__ 的文档。 ## Insight 常用关键字 ## 容器日志 - kubernetes.container_image: 容器镜像名称 - kubernetes.container_name: 容器名称 - kubernetes.namespace_name: 命名空间名称 - kubernetes.pod_name: Pod 名称 - log: 日志内容 - time: 日志时间戳 ## 主机日志 - syslog.file: 日志文件路径 - syslog.host: 主机名称 - log: 日志内容 如果你想要精确匹配某个特定的值,可以在关键字后加入 `.keyword` 后缀,例如 `kubernetes.container_name.keyword`。 ## 示例 1. 查询指定 Pod 中指定容器的日志 ```lucene kubernetes.pod_name.keyword:nginx-pod AND kubernetes.container_name.keyword:nginx ``` 2. 查询 Pod 名称中包含 `nginx-pod` 的容器日志 ```lucene kubernetes.pod_name:nginx-pod ```