如何在Elasticsearch中将shingle标记存储到文档的数据字段?

时间:2017-07-18 01:32:30

标签: elasticsearch logstash

我一直在寻找一种方法,在将字符数据解析为Logstash时,将由shingle token过滤器创建的标记附加到字段数据。到目前为止我发现的所有文档主要讨论如何使用shingle令牌过滤器来使用REST API来分析已经记录和索引的数据的文本,但是我还没有找到附加所述文本的方法数据字段值在被索引时。

简而言之,我想要实现的目标如下:假设我有一条消息

STORE THE SHINGLES

应用最大和最小尺寸为2的木瓦过滤器,我们得到标记:

STORE THETHE SHINGLES

我想找到一种方法将消息解析为Logstash,使其被编入索引:

{
    ...
    "message": "STORE THE SHINGLES",
    "shingle_2": ["STORE THE", "THE SHINGLES"],
    ...
}

如果无法做到这一点,那么我希望是否有办法将这些木瓦数据附加到已经记录和编入索引的数据中,反过来这样:

{
    ...
    "message": "STORE THE SHINGLES",
    ...
}

......进入这个:

{
    ...
    "message": "STORE THE SHINGLES",
    "shingle_2": ["STORE THE", "THE SHINGLES"],
    ...
}

提前感谢您的任何帮助或建议!

1 个答案:

答案 0 :(得分:0)

第一件事是分析过程在您索引文档的那一刻发生在ES内部,因此Logstash无法识别任何文档。

第二件事是,无论您配置的分析过程如何,ES都不会以任何方式修改您发送的源文档

在我看来,您唯一的选择是使用message字段的内容点击_analyze API,解析响应并修改源文档,然后再将其编入ES。

例如,让我们说你的文件是这样的:

{
    ...
    "message": "STORE THE SHINGLES",
    ...
}

首先,您要调用此

POST _analyze
{
  "analyzer" : "your_shingle_analyzer",
  "text" : "STORE THE SHINGLES"
}

你得到以下回复:

{
  "tokens" : [ {
    "token" : "STORE THE",
    "start_offset" : 0,
    "end_offset" : 9,
    "type" : "<ALPHANUM>",
    "position" : 0
  }, {
    "token" : "THE SHINGLE",
    "start_offset" : 10,
    "end_offset" : 21,
    "type" : "<ALPHANUM>",
    "position" : 1
  } ]
}

将上述回复减少到["STORE THE", "THE SHINGLES"]很简单,然后您可以将其附加到您的文档并发送给ES:

PUT your_index/your_type/1234
{
    ...
    "message": "STORE THE SHINGLES",
    "shingle_2": ["STORE THE", "THE SHINGLES"],
    ...
}