20 个稳定版本
1.13.1 | 2023年7月6日 |
---|---|
1.12.1 | 2023年3月29日 |
1.9.0 | 2022年10月19日 |
1.8.0 | 2022年6月21日 |
1.0.1 | 2021年7月31日 |
#216 in 算法
102 每月下载量
300KB
6.5K SLoC
tau 引擎
此包提供了一组库,通过在文档上运行和匹配规则来标记文档。
概述
该引擎使用 Pratt 解析器和树求解器来评估规则对文档的检测逻辑,如果结果为真,则该文档被视为由该规则标记。
规则
规则用于标记文档,由三部分组成
detection
:评估文档的逻辑。true positives
:必须评估为真的示例文档。true negatives
:必须评估为假的示例文档。
检测块由一个条件和标识符组成。这允许规则简单但表达性强,以下是一个简要总结:
标识符
标识符用于帮助保持条件简洁,通常包含匹配逻辑的核心。它们由键/值对组成,允许从文档中提取数据并评估其值。需要注意的是,映射被视为合取,而序列被视为析取。
标识符使用以下匹配逻辑:
foobar
:foobar 的精确匹配foobar*
:以 foobar 开头*foobar
:以 foobar 结尾*foobar*
:包含 foobar?foobar
:正则表达式 foobar
上述任何一种都可以使用 i
前缀进行不区分大小写的匹配,例如
ifoobar
ifoobar*
可以使用 '
和 "
组合进行转义。
条件
条件只是一个布尔表达式,并支持以下操作:
and
:逻辑合取or
:逻辑析取==
:相等比较>
、>=
、<
、<=
:数值比较not
:取反all(i)
:使序列表现为合取of(i, x)
:确保序列至少有指定数量的匹配项
示例
这是一个示例,说明引擎如何根据提供的规则标记文档
tau-engine = "1.0"
use std::borrow::Cow;
use tau_engine::{Document, Rule, Value};
// Define a document.
struct Foo {
foo: String,
}
impl Document for Foo {
fn find(&self, key: &str) -> Option<Value<'_>> {
match key {
"foo" => Some(Value::String(Cow::Borrowed(&self.foo))),
_ => None,
}
}
}
// Write a rule.
let rule = r#"
detection:
A:
foo: foobar
condition: A
true_positives:
- foo: foobar
true_negatives:
- foo: foo
"#;
// Load and validate a rule.
let rule = Rule::load(rule).unwrap();
assert_eq!(rule.validate().unwrap(), true);
// Create a document.
let foo = Foo {
foo: "foobar".to_owned(),
};
// Evalute the document with the rule.
assert_eq!(rule.matches(&foo), true);
这是一个示例,说明如何使用引擎在JSON上标记
tau-engine = { version = "1.0", features = ["json"] }
use serde_json::json;
use tau_engine::{Document, Rule};
// Write a rule.
let rule = r#"
detection:
A:
foo: foobar
condition: A
true_positives:
- foo: foobar
true_negatives:
- foo: foo
"#;
// Load and validate a rule.
let rule = Rule::load(rule).unwrap();
assert_eq!(rule.validate().unwrap(), true);
// Create a document.
let foo = json!({
"foo": "foobar",
});
// Evalute the document with the rule.
assert_eq!(rule.matches(&foo), true);
依赖
~5–7MB
~128K SLoC