使用 node.js 的 Elasticsearch 如何在将文档插入索引时创建唯一字段
Elasticsearch with node.js how to make unique field when insert document to an index
我正在为我的项目开发搜索引擎,我正在为服务器使用 Elasticsearch
和 node.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.
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"}
}
我正在为我的项目开发搜索引擎,我正在为服务器使用 Elasticsearch
和 node.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.
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"}
}