摄取/ /转换数据浓缩在一个elasticsearch指数从第二个与动态信息 &



我想根据第二个索引中给定的(加权)术语频率动态地丰富现有索引。

假设我有一个索引,我想分析一个字段(field_of_interest):

POST test/_doc/1
{
"field_of_interest": "The quick brown fox jumps over the lazy dog."
}
POST test/_doc/2
{
"field_of_interest": "The quick and the dead."
}
POST test/_doc/3
{
"field_of_interest": "The lazy quack was quick to quip."
}
POST test/_doc/4
{
"field_of_interest": "Quick, quick, quick, you lazy, lazy guys! "
}

和第二个(scores)具有关键字对和权重:

POST scores/_doc/1
{
"term": "quick",
"weight": 1
}
POST scores/_doc/2
{
"term": "brown",
"weight": 2
}
POST scores/_doc/3
{
"term": "lazy",
"weight": 3
}
POST scores/_doc/4
{
"term": "green",
"weight": 4
}

我想定义并执行某种分析、摄取、转换、充实、重新索引或任何动态添加一个新字段points到第一个索引,这是field_of_interest在第一个索引中的第二个索引中每个搜索词的加权出现次数的聚合(和)。因此,在执行此操作之后,我希望新索引看起来像这样(省略了一些字段):

{
"_id":"1",
"_source":{
"field_of_interest": "The quick brown fox jumps over the lazy dog.",
"points": 6
}
},
{
"_id":"2",
"_source":{
"field_of_interest": "The quick and the dead.",
"points": 1
}
},
{
"_id":"3",
"_source":{
"field_of_interest": "The lazy quack was quick to quip.",
"points": 4
}
},
{
"_id":"4",
"_source":{
"field_of_interest": "Quick, quick, quick, you lazy, lazy guys! ",
"points": 9
}
}

如果可能的话,甚至可以为每个词获取单独的字段,列出出现次数的加权和,例如

{
"_id":"4",
"_source":{
"field_of_interest": "Quick, quick, quick, you lazy, lazy guys! ",
"quick": 3,
"brown": 0,
"lazy": 6,
"green": 0,
"points": 9
}
}

我现在的问题是如何在Elasticsearch中做到这一点。我对Elastic相当陌生,有许多概念看起来很有希望,但到目前为止,我甚至无法确定部分解决方案。

我在Elasticsearch 7上。x(但将开放到8.x),并希望通过API实现这一点,即不使用Kibana。

我首先想到的_ingest管道与_enrich策略,因为我有点试图将信息从一个索引添加到另一个。但我的理解是,匹配不允许查询,所以我不知道这是如何工作的。

我也看了_transform,_update_by_query,自定义评分,_term_vector,但说实话,我有点迷路了。

如果我想做的事情是否可以用Elasticsearch完成(我认为它将是一种完美的工具),如果是这样,那么许多不同的Elasticsearch概念中哪一个最适合我的用例,我将不胜感激。

遵循以下步骤:

  1. /_滚动第二个索引中的每个文档。
  2. 在第一个索引中查找(简单匹配查询)
  3. 在每个匹配的文档上通过脚本更新操作增加点数。

在第一个索引中将单个单词作为字段并不是一个好主意。我们不知道将在句子中找到哪些单词,因此您的索引映射将会出现大量动态字段,这是不可取的。更好的方法是向第一个索引添加嵌套映射。使用以下映射:

{
"words" : {
"type" : "nested",
"properties" : {
"name" : {"type" : "keyword"},
"weight" : {"type" : "float"}
}
}
}

然后,只需将找到的每个单词追加到该数组。"points"可以是一个单独的字段

你想做的必须在客户端完成。没有内置的方法来处理这样的操作。

HTH .

最新更新