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。在此处查看结果: