diff --git a/elastic/index.js b/elastic/index.js index 249d04e..f895c83 100644 --- a/elastic/index.js +++ b/elastic/index.js @@ -1,6 +1,5 @@ const events = require('events'); const elasticsearch = require('elasticsearch'); -const uuidv4 = require('uuid/v4'); const eventEmitter = new events.EventEmitter(); const promisify = require('promisify-event'); @@ -47,7 +46,7 @@ function bulkInsert({ index, type, documents }) { const request = documents.reduce((acc, current) => { return [ ...acc, - Object.assign({}, insert, { _id: current.id }), + {...insert, index: { ...insert.index, _id: current.id } }, current ]; }, []); @@ -144,7 +143,10 @@ function incrementViewCount(id) { type: 'story', id, body: { - script: `ctx._source.views += 1; ctx._source.newsViews += '${Date.now()}';` + script: { + lang: 'painless', + inline: `ctx._source.views += 1; ctx._source.newsViews.add(${Date.now()}L);` + } }, retry_on_conflict: 3 }, function (err) { diff --git a/init/news/index.js b/init/news/index.js index dffc19a..8d13cac 100644 --- a/init/news/index.js +++ b/init/news/index.js @@ -1,3 +1,4 @@ +const { exec } = require('child_process'); const path = require('path'); const svn = require('node-svn-ultimate'); const fse = require('fs-extra'); @@ -5,6 +6,20 @@ const matter = require( 'gray-matter'); const { Observable } = require( 'rx'); const { bulkInsert } = require( '../../elastic'); const { log, readDir } = require( '../../utils'); + +const cURL = `curl -XPUT "http://localhost:9200/news" -H 'Content-Type: application/json' -d' +{ + "mappings": { + "story": { + "properties": { + "newsViews": { + "type": "date" + } + } + } + } +}'`; + const logger = log('news'); const viewMap = fse.readFileSync(path.resolve(__dirname, './views.txt'), 'utf8') .split('\n') @@ -31,7 +46,7 @@ async function buildAndInsert(file) { content: fileData.content, data: { ...fileData.data }, views: id in viewMap ? viewMap[id] : 1, - newsViews: [], + newsViews: [Date.now()], url }; stories = [ ...stories, story ]; @@ -42,7 +57,24 @@ async function buildAndInsert(file) { return; } +function mapNewsViews() { + return new Promise((resolve, reject) => { + exec(cURL, (error, stdout, stderr) => { + if (error) { + console.error(`exec error: ${error}`); + reject(); + return; + } + if (JSON.parse(stdout).acknowledged) { + resolve(); + } + stderr && console.log(`${stderr}`); + }); + }); +} + exports.getStoryData = async () => { + await mapNewsViews(); fse.remove(storiesDir, (err) => { if (err) { logger(err.message, 'yellow');