使用 node.js 的 Elasticsearch 如何在将文档插入索引时创建唯一字段

Elasticsearch with node.js how to make unique field when insert document to an index

我正在为我的项目开发搜索引擎,我正在为服务器使用 Elasticsearchnode.js

每天晚上我都有一个解析器从某个网站抓取数据并将其插入数据库。 现在它复制了我已有的数据。

我能否在插入文档时在索引中创建一个唯一字段,例如 title : {unique : true} 这样它就不会插入带有此标题的文档

这是我的代码:

async function insertManual(manual) {
  return new Promise(async (resolve, reject) => {
    const result = await client.index({
        index : 'completeindexthree',
        body : {
            brand : manual.brand,
            category : manual.category,
            url : manual.url,
            title : manual.title, // example {unique : true}
            parsingData : new Date().toString()
        }
    })
    await client.indices.refresh({index: 'completeindexthree'})
    resolve(result);
  })
} 

第二个问题是,如何从 node.js 而非 logstach 中的索引中删除所有已按标题进入的重复项?

Tldr;

是的,这是可能的,但不是通过使用 unique 关键字。 根据 documentation,如果您设置 _id 并且此 ID 已经存在,它将是 replaced/overwrite

If the target is an index and the document already exists, the request updates the document and increments its version.

还有你will find this section

Using _create guarantees that the document is only indexed if it does not already exist.

修复

您应该为每个文档设置一个 _id 并使用 create

您的代码可能如下所示:

async function insertManual(manual) {
  return new Promise(async (resolve, reject) => {
    const result = await client.create({
        index : 'completeindexthree',
        id: manual.id,   // <- Here is your unique id.
        body : {
            brand : manual.brand,
            category : manual.category,
            url : manual.url,
            title : manual.title, // example {unique : true}
            parsingData : new Date().toString()
        }
    })
    await client.indices.refresh({index: 'completeindexthree'})
    resolve(result);
  })
} 

如果您不提供 id,elastic search 会创建一个唯一的 id,如果您提供,它会创建您提供的 id。

payload应该是这样的

{
 id:"you_unique_id",
 body:{foo,"bar"}

}