Solr:是否可以在查询中使用正则表达式提取字段
Solr: Is it possible to extract fields with regex in Query
我是 Solr 的新手,我来自 Splunk。我只想知道是否可以在查询时提取字段。例如。我有这个流查询:
search(A3secLinuxLogs,fq=_time:[NOW-1DAY TO NOW] AND log:Accepted,fl="_time,hostname,raw_log,service_name,pid",sort=_time desc,rows=1000)
我得到这样的结果:
{
"hostname": [
"sa3secessuperset01"
],
"pid": [
27942
],
"raw_log": [
"Jul 16 16:17:21 sa3secessuperset01 sshd[27942]: Accepted publickey for debian from 10.0.9.3 port 40954 ssh2: ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxx"
],
"_time": [
"2021-07-16T16:17:21Z"
],
"service_name": [
"sshd[27942]"
]
},
我想从“raw_log”中使用这样的正则表达式提取源 ip
from:(?<src_ip>\d+\.\d+\.\d+\.\d+)
也许是这样的:
select(
search(A3secLinuxLogs,fq=_time:[NOW-1DAY TO NOW] AND log:Accepted,fl="_time,hostname,raw_log,service_name,pid",sort=_time desc,rows=1000),
hostname,
raw_log,
service_name,
pid,
regextract("raw_log","from:(?<src_ip>\d+\.\d+\.\d+\.\d+)"))
目前我使用 Spark 来实现相同的目的,但我不知道是否有直接在 Solr 中实现的方法。
我也尝试在“索引时间”中使用标记器和 filters 编辑模式来实现相同的目的,但我得到的是这样的:
{
"hostname": [
"sa3secessuperset01"
],
"pid": [
27942
],
"raw_log": [
"Jul 16 16:17:21 sa3secessuperset01 sshd[27942]: Accepted publickey for debian from 10.0.9.3 port 40954 ssh2: ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxx"
],
"_time": [
"2021-07-16T16:17:21Z"
],
"service_name": [
"sshd[27942]"
],
"src_ip": [
"Jul 16 16:17:21 sa3secessuperset01 sshd[27942]: Accepted publickey for debian from 10.0.9.3 port 40954 ssh2: ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxx"
],
},
我想要这样的东西:
{
"hostname": [
"sa3secessuperset01"
],
"pid": [
27942
],
"raw_log": [
"Jul 16 16:17:21 sa3secessuperset01 sshd[27942]: Accepted publickey for debian from 10.0.9.3 port 40954 ssh2: ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxx"
],
"_time": [
"2021-07-16T16:17:21Z"
],
"service_name": [
"sshd[27942]"
],
"src_ip": [
"10.0.9.3"
],
},
我不得不说分析工作正常,但“索引”的数据看起来不像我想要的那样。
基本上我只想知道是否有办法实现我想要的,我宁愿在查询中使用正则表达式,但如果不可能,我想知道如何使用分词器和过滤器。
此致。
您可能必须使用正则表达式模式分词器:
https://solr.apache.org/guide/8_9/tokenizers.html#regular-expression-pattern-tokenizer
并调整“src_ip”字段的表达式
例如:
<fieldType name="extract_ip" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.PatternTokenizerFactory" pattern="(a-zA-Z0-9\s)* (\d+\.\d+\.\d+\.\d+) (a-zA-Z0-9\s)*" group="2" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
将意味着仅索引 IP。在此处查看结果:
我是 Solr 的新手,我来自 Splunk。我只想知道是否可以在查询时提取字段。例如。我有这个流查询:
search(A3secLinuxLogs,fq=_time:[NOW-1DAY TO NOW] AND log:Accepted,fl="_time,hostname,raw_log,service_name,pid",sort=_time desc,rows=1000)
我得到这样的结果:
{
"hostname": [
"sa3secessuperset01"
],
"pid": [
27942
],
"raw_log": [
"Jul 16 16:17:21 sa3secessuperset01 sshd[27942]: Accepted publickey for debian from 10.0.9.3 port 40954 ssh2: ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxx"
],
"_time": [
"2021-07-16T16:17:21Z"
],
"service_name": [
"sshd[27942]"
]
},
我想从“raw_log”中使用这样的正则表达式提取源 ip
from:(?<src_ip>\d+\.\d+\.\d+\.\d+)
也许是这样的:
select(
search(A3secLinuxLogs,fq=_time:[NOW-1DAY TO NOW] AND log:Accepted,fl="_time,hostname,raw_log,service_name,pid",sort=_time desc,rows=1000),
hostname,
raw_log,
service_name,
pid,
regextract("raw_log","from:(?<src_ip>\d+\.\d+\.\d+\.\d+)"))
目前我使用 Spark 来实现相同的目的,但我不知道是否有直接在 Solr 中实现的方法。
我也尝试在“索引时间”中使用标记器和 filters 编辑模式来实现相同的目的,但我得到的是这样的:
{
"hostname": [
"sa3secessuperset01"
],
"pid": [
27942
],
"raw_log": [
"Jul 16 16:17:21 sa3secessuperset01 sshd[27942]: Accepted publickey for debian from 10.0.9.3 port 40954 ssh2: ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxx"
],
"_time": [
"2021-07-16T16:17:21Z"
],
"service_name": [
"sshd[27942]"
],
"src_ip": [
"Jul 16 16:17:21 sa3secessuperset01 sshd[27942]: Accepted publickey for debian from 10.0.9.3 port 40954 ssh2: ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxx"
],
},
我想要这样的东西:
{
"hostname": [
"sa3secessuperset01"
],
"pid": [
27942
],
"raw_log": [
"Jul 16 16:17:21 sa3secessuperset01 sshd[27942]: Accepted publickey for debian from 10.0.9.3 port 40954 ssh2: ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxx"
],
"_time": [
"2021-07-16T16:17:21Z"
],
"service_name": [
"sshd[27942]"
],
"src_ip": [
"10.0.9.3"
],
},
我不得不说分析工作正常,但“索引”的数据看起来不像我想要的那样。
基本上我只想知道是否有办法实现我想要的,我宁愿在查询中使用正则表达式,但如果不可能,我想知道如何使用分词器和过滤器。
此致。
您可能必须使用正则表达式模式分词器:
https://solr.apache.org/guide/8_9/tokenizers.html#regular-expression-pattern-tokenizer
并调整“src_ip”字段的表达式
例如:
<fieldType name="extract_ip" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.PatternTokenizerFactory" pattern="(a-zA-Z0-9\s)* (\d+\.\d+\.\d+\.\d+) (a-zA-Z0-9\s)*" group="2" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
将意味着仅索引 IP。在此处查看结果: