elasticsearch 如何在某个搜索查询后从响应对象中获取特定的字段值,并对返回的项目应用循环

rryofs0p  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(165)

我已经在Node.js中编写了一个脚本,它必须识别文档的其他所需版本(重复的版本),然后通过替换来删除该版本。
比如说
文件1 d_path

file://storage004.directory.intra/abc.txt

文件2x 1 m1n1x:

file://homestore.directory.intra/abc.txt,

基本上,这两个文档除了单词homestorestorage004之外都是相似的,因此基本上是重复的,并且我们有大约2500万个数据要处理,因此我们的要求是删除所有重复文档的storage004版本。
故障/问题:我是node.js的新手,我想从_source中提取一个字段(字段名为d_path),并在那里应用循环条件,到目前为止,下面的for循环已被注解掉,
问题是如何从result.hits.hits返回/提取d_path

async function index(req, res, next) {

    let esFinalQuery = {
        "query": {
            "match_phrase": {
                "d_path": "file://story.directory.intra/"
            }
        },
    };

    //return res.send(esFinalQuery);

    const result = await esClient.search({
        index: 'elasticduplicate',
        type: '_doc',
        body: esFinalQuery
    })
    .catch(err => { 
        console.log(err);
    });

    var homeArr=[];
    //homeArr=result.hits.hits;
    /*for (item in homeArr) {
        const path_of_duplicate = item._source.d_path.replace('homestore', 'storage004')
        const document = esClient.exists({
            index: 'elasticduplicate',
            type: '_doc',
            body: {
                query: {
                    match: {
                        "d_path.keyword":path_of_duplicate
                    }
                }
            }
        });
        if (document) {
            await esClient.deleteByQuery({
                index: "elasticduplicate",
                type: "_doc",
                body: {
                    query: {
                        match: { "d_path.keyword": path_of_duplicate }
                    }
                }
            });
        }
    }*/
    return res.send(result.hits.hits.forEach(function (hit) {
        homeArr.push('yeah '+hit);
    }));

}
m1m5dgzv

m1m5dgzv1#

希望这能有所帮助:

async function index(req, res, next) {
  const docsToKeep = await esClient.search({
    index: "elasticduplicate",
    type: "_doc",
    body: {
      query: {
        match_phrase: {
          d_path: "file://story.directory.intra/",
        },
      },
    },
  });

  const foundDuplicates = [];

  for (const docToKeep of docsToKeep.hits.hits) {
    const pathOfDuplicate = docToKeep._source.d_path.replace(
      "homestore",
      "storage004"
    );

    const duplicateExists = await esClient.exists({
      index: "elasticduplicate",
      type: "_doc",
      body: {
        query: {
          match: {
            "d_path.keyword": pathOfDuplicate,
          },
        },
      },
    });

    if (duplicateExists) {
      await esClient.deleteByQuery({
        index: "elasticduplicate",
        type: "_doc",
        body: {
          query: {
            match: { "d_path.keyword": pathOfDuplicate },
          },
        },
      });

      foundDuplicates.push(pathOfDuplicate);
    }
  }

  res.send(JSON.stringify(foundDuplicates));
}

备注:

  • 请确保原始匹配查询d_path:"file://story.directory.intra/"正确
  • 记住await所有异步(ES/网络)调用
  • 看起来您计划在Web服务器(express?)处理程序内运行此脚本。考虑到要处理的记录很多,它可能会在中途停止超时(您仍然可以重新运行并从离开的位置继续,但您不会得到脚本结束统计信息)。

相关问题