ES学习--python ES client初步使用二(使用Lucene语法查询)

在威胁检测的场景中,sigma可以将规则转化为Lucene查询语句,可直接用于日志威胁检测。

但是首先,理解Lucene在ES中的使用,语法

Lucene是什么

Lucene的发音为[luːsin]

Elasticsearch 背后使用 Lucene 搜索引擎,因此页提供了一个接口,可以使用 Lucene 语句进行查询操作。

语法参考自 Apache Lucene 官网文档(版本 8.3.0)

ES中如何使用Lucene

Query string query

Query string query | Elasticsearch Guide [8.14] | Elastic

由于它会对任何无效语法返回错误,因此我们不建议对搜索框使用query_string查询。

如果不需要支持查询语法,请考虑使用匹配查询。如果需要查询语法的功能,请使用不太严格的 simple_query_string 查询。

 Query string syntax.   ES中记录的查询的一些语法规则

您可以使用 query_string 查询创建包含通配符、跨多个字段的搜索等的复杂搜索。虽然查询是通用的,但查询是严格的,如果查询字符串包含任何无效的语法,则返回错误。

Elasticsearch 在内部使用 Apache Lucene 来解析正则表达式。

GET /_search
{
    "query": {
        "query_string" : {
            "query" : "(new york city) OR (big apple)",
            "default_field" : "content"
        }
    }
}

 

查询语法

 所以要用好Lucene 查询规则,应该了解Lucene 语法,ES查询。

下面根据博客学习一些Lucene 的语法。

Elasticsearch 其后的搜索引擎 Lucene 的 QueryString 查询语法 - 陪她去流浪 (twofei.com)

QueryString

QueryString,带语法的查询字符串, 就是输入到搜索编辑框中的那一整个字符串。

一个 QueryString 会被拆分成多个 Terms(即词条)和 运算符。 词条分两种:1. 单个的 Term(单词), 2. Phrase(词组)。

  • 单个的 Term 就是一个单词(比如:hello)。
  • 词组就是用引号引起来的一组单词(比如:"hello world")。

Field 即字段。Lucene 中的文档(Document)是由若干字段构成的,简单说就是 Key-Value 对。

ES查询例子:

搜索时:如果  lucene为 "field:\"i am a boy\""

"i am a boy" 会在field字段中匹配整个词组。

但如果 i am a boy 不加双引号,则会被切分为 单个term, 匹配 ‘i’ 'am'  'a'  'boy'四个项。导致结果增多。

输入结构为  "query": Lucene查询句子
 query = {
        "query": {
            "bool": {
                "must": [{
                "query_string": {
                "analyze_wildcard": True,
                "query": "field:\"i am a boy\""
            }}]
            }
        }

 

 字段查询

  • 如果在查询的时候没有指定字段,则查询索引的默认字段。
    • 比如有一个索引包含两个字段,“标题(title)”和“文本(text)”,并且“文本(text)”是默认字段。

 

  • 当需要查询某个字段具有某值时,需要指定字段的名字。语法:字段名:查询内容
    • 比如:title:Way 或 title:"The Right Way"
    • 注意第 2 个例子中的引号,因为查询的是一个词组,中间有空格,应该用引号引起来。
    • 而如果忘记了加引号写成title:The Right Way,则语义是:仅在“title”中查找“The”,在默认字段(本文的“text”)中查找“Right” 或 “Way”。

 通配符使用

Lucene 支持在查询单词(不支持词组)的时候使用通配符查询。

单个字符的通配符用?表示,多个(包含 0 个)字符的通配符用*表示。

比如要查询“test”或“text”,则可以查询te?t。要查询“test”,“tests”或“tester”,则可以查询test*,或 te*t

注意:通配符不能出现在查询内容的最开始。

比如:*est 是错误的查询语法。

 

 正则表达式搜索

正则表达式应该放在两个“/”之间。

比如:/[mb]oat/ 查询包含“moat"或"boat”的字段。

 

 布尔运算符

布尔运算符用于用布尔逻辑组合/连接多个查询条件。

Lucene 支持的布尔运算符:AND&&+OR||NOT!-

注意:

  • 布尔运算符中的字母必须全部大写;
  • 二元运算符(AND && OR ||)与查询条件之间需要用空格隔开;
  • 一元运算符(+ ! -)与查询条件之间不能用空格隔开

 

  1. OR||, 是默认的连接运算符,可以省略。用 OR 连接的两个查询条件,只要满足其中一个即可。
  2. AND或 &&,用于连接两个查询条件,需要这两个条件同时满足。
  3. +表示紧跟其后的词条必须出现。

    比如:查询一定包含jakarta但可能包含lucene的文档:+jakarta lucene

  4. NOT! 表示紧跟其后的词条一定不能出现。相当于求差集。

    比如,要查询包含jakarta apache但不包含Apache Lucene的文档:"jakarta apache" NOT "Apache Lucene"

    注意:NOT 不能单独使用!

 分组

分组用于构造子查询。用小括号表示。主要用于控制布尔逻辑查询的逻辑。

比如,要查询出现“jakarta”或“apache”(其一或两者都),且出现“website”的文档:(jakarta OR apache) AND website

特殊字符的转义

很多的标点符号有特殊意义,为了搜索这些符号本身,它们应该被转义。

当前版本的特殊字符有:+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /

转义的方式是在每个这些字符的前面加上“\”符号。

比如要搜索“(1+1):2”,则应该输入\(1\+1\)\:2

 

参考

Elasticsearch 其后的搜索引擎 Lucene 的 QueryString 查询语法 - 陪她去流浪 (twofei.com)

posted @ 2025-01-17 17:37  zzl14  阅读(54)  评论(0)    收藏  举报