Skip to main content

Object AC (Aho-Corasick)

An Aho-Corasick multi pattern matcher created with T.ac( _pattern_array_ )

This is a convenience utility provided to you by the Trisul framework because multi pattern matching is such a frequent need in network analytics applications.

Creating the object​

The object is created and stored in a global state, either as a global variable or as a member in the Global T table. Note that the global states are per-file not across LUA files.

onload = function()
T.patternMatcher = T.ac( {'string1','string2','strin3'...})
end,

.. later ..

T.patternMatcher:match_one(..)

Functions​

A summary of the functions available in this object.

NameInOutDescription
match_allstringtableMatches all patterns. The matches are returned in a table
{ pattern_matched = position
>The position indicates the last matching character, not the first.
match_onestringtableSame as match_all, but stops after finding a single match. Use this method for alerting on pattern matches.

Function match_all​

Tries to match all patterns against the input text.

Purpose​

Use this parameter passed to your Lua function to integrate your data into the Trisul framework.

Parameters​

textstringthe text to be matched

Return value​

A table of matches. See the debug output below

Usage​

In this example we are attempting to match a list of hostnames against a DNS Full Text Search text.

The code at the point the dbg() is called is shown below

onload = function()
T.patterns = T.ac( { "toolbar", "nsatc", "HOLLERITH" })
end,

onflush= function(dbengine, fts)
local m = T.patterns:match_all( fts:text() )
dbg();
if next(m) then
print("FOUND a match.. do your thing"
end
..

Using the debugger, we can inspect the return value m

debugger.lua> p m
m => {"toolbar" = 87}
debugger.lua> p fts:text()
fts:text() => "QUERY\9ID: 39219\9Flags:0×0100\9QDCount:1\9ANCount:0\9NSCount:0\9ARCount:0\Questions\.toolbar.google.com\9\9A\9IN\\"
debugger.lua>

Function match_one​

Match all the strings in the pattern against the input text.
Stop at the first match. The match_all tries to match all patterns and does not stop after the first match.