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||)与查询条件之间需要用空格隔开; - 一元运算符(
+!-)与查询条件之间不能用空格隔开
OR或||, 是默认的连接运算符,可以省略。用OR连接的两个查询条件,只要满足其中一个即可。AND或&&,用于连接两个查询条件,需要这两个条件同时满足。+表示紧跟其后的词条必须出现。
比如:查询一定包含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)

浙公网安备 33010602011771号