跳转至

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. 指定字段

    field1:keyword1 AND (field2:keyword2 OR field3:keyword3) NOT field4:keyword4
    

    解释如下:

    • 查询字段  field1  必须包含关键字  keyword1
    • 同时,字段  field2  必须包含关键字  keyword2  或字段  field3  必须包含关键字  keyword3
    • 最后,字段  field4  不得包含关键字  keyword4
  2. 不指定字段

    keyword1 AND (keyword2 OR keyword3) NOT keyword4
    

    解释如下:

    • 查询关键字  keyword1  必须存在于任意可搜索的字段中。
    • 同时,关键字  keyword2  必须存在或关键字  keyword3  必须存在于任意可搜索的字段中。
    • 最后,关键字  keyword4  不得存在于任意可搜索的字段中。

模糊查询

在 Lucene 中,模糊查询可以通过波浪号 ~ 来实现近似匹配。您可以指定一个编辑距离来限制匹配的相似度程度。

term~

在上述示例中, term 是要进行模糊匹配的关键字。

请注意以下几点:

  • 波浪号  ~  后面可以指定一个可选的参数,用于控制模糊查询的相似度。
  • 参数值范围为 0 到 2 之间,其中 0 表示完全匹配,1 表示一次编辑操作(如增加、删除或替换字符)内可以匹配,2 表示两次编辑操作内可以匹配。
  • 如果不指定参数值,默认使用 0.5 作为相似度阈值。
  • 模糊查询将返回与给定关键字相似的文档,但会有一定的性能开销,特别是对于较大的索引。

通配符

Lucene 支持以下两种通配符查询:

  1. * 通配符: * 用于匹配零个或多个字符。

    例如, te*t  可以匹配 "test"、"text"、"tempest" 等。

  2. ? 通配符: ? 用于匹配单个字符。

    例如, te?t  可以匹配 "test"、"text" 等。

举例说明

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. 指定字段

    timestamp:[2022-01-01 TO 2022-01-31]
    

    这将检索 timestamp 字段在 2022 年 1 月 1 日到 2022 年 1 月 31 日之间的数据。

  2. 不指定字段

    *:[value1 TO value2]
    

    这将在整个索引中搜索取值范围从 value1value2 的文档。

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 中指定容器的日志

    kubernetes.pod_name.keyword:nginx-pod AND kubernetes.container_name.keyword:nginx
    
    2. 查询 Pod 名称中包含 nginx-pod 的容器日志

    kubernetes.pod_name:nginx-pod