|
|
@@ -0,0 +1,183 @@
|
|
|
+/**
|
|
|
+ * Search
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
+//module.exports = SearchClient;
|
|
|
+
|
|
|
+/*
|
|
|
+var elasticsearch = require('elasticsearch'),
|
|
|
+ debug = require('debug')('crowi:lib:search'),
|
|
|
+
|
|
|
+function SearchClient(crowi) {
|
|
|
+ this.crowi = crowi;
|
|
|
+ this.Page = crowi.model('Page');
|
|
|
+ this.Config = crowi.model('Config');
|
|
|
+ this.config = crowi.getConfig();
|
|
|
+}
|
|
|
+
|
|
|
+SearchClient.prototype.deleteIndex = function() {
|
|
|
+};
|
|
|
+*/
|
|
|
+
|
|
|
+module.exports = function(crowi) {
|
|
|
+ var elasticsearch = require('elasticsearch'),
|
|
|
+ debug = require('debug')('crowi:lib:search'),
|
|
|
+ Page = crowi.model('Page'),
|
|
|
+ Config = crowi.model('Config'),
|
|
|
+ config = crowi.getConfig(),
|
|
|
+ TYPE_PAGE = 'page',
|
|
|
+ SLOW_INTERVAL = 200, // 200ms interval.
|
|
|
+ lib = {};
|
|
|
+
|
|
|
+ // TODO: configurable
|
|
|
+ var host = '127.0.0.1:9200';
|
|
|
+ var index_name = 'crowi';
|
|
|
+ var default_mapping_file = crowi.resourceDir + 'search/mappings.json';
|
|
|
+
|
|
|
+ var client = new elasticsearch.Client({
|
|
|
+ host: host,
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ lib.deleteIndex = function() {
|
|
|
+ return client.indices.delete({
|
|
|
+ index: index_name
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ lib.buildIndex = function() {
|
|
|
+ return client.indices.create({
|
|
|
+ index: index_name,
|
|
|
+ body: require(default_mapping_file)
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ lib.rebuildIndex = function() {
|
|
|
+ var self = this;
|
|
|
+
|
|
|
+ return self.deleteIndex()
|
|
|
+ .then(function(data) {
|
|
|
+ return self.buildIndex();
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ lib.addAllPages = function() {
|
|
|
+ var offset = 0;
|
|
|
+ var stream = Page.getStreamOfFindAll();
|
|
|
+ var self = this;
|
|
|
+
|
|
|
+ stream.on('data', function (doc) {
|
|
|
+ if (!doc.creator || !doc.revision) {
|
|
|
+ debug('Skipped', doc.path);
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+
|
|
|
+ var likeCount = doc.liker.length;
|
|
|
+ var bookmarkCount = 0; // TODO
|
|
|
+ var updated = doc.updatedAt; // TODO
|
|
|
+
|
|
|
+ self.addPage(doc._id.toString(), doc.path, doc.revision.body, doc.creator.username, likeCount, bookmarkCount, updated, true)
|
|
|
+ .then(function(data) {
|
|
|
+ debug('Page Added', data);
|
|
|
+ }).catch(function (err) {
|
|
|
+ debug('Error addPage:', err);
|
|
|
+ });
|
|
|
+
|
|
|
+ //debug('Data received: ', doc.path, doc.liker.length, doc.revision.body);
|
|
|
+ }).on('error', function (err) {
|
|
|
+ debug('Error stream:', err);
|
|
|
+ // handle err
|
|
|
+ }).on('close', function () {
|
|
|
+ debug('Close');
|
|
|
+ // all done
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @return Promise
|
|
|
+ */
|
|
|
+ lib.addPage = function(id, path, body, creator, likeCount, bookmarkCount, updated, is_public) {
|
|
|
+ var self = this;
|
|
|
+
|
|
|
+ return client.create({
|
|
|
+ index: index_name,
|
|
|
+ type: 'page',
|
|
|
+ id: id,
|
|
|
+ body: {
|
|
|
+ path: path,
|
|
|
+ body: body,
|
|
|
+ creator: creator,
|
|
|
+ likeCount: likeCount,
|
|
|
+ bookmarkCount: bookmarkCount,
|
|
|
+ is_public: is_public,
|
|
|
+ updated: updated,
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ lib.updatePage = function(id, path, body, creator, likeCount, bookmarkCount, updated, is_public) {
|
|
|
+ };
|
|
|
+
|
|
|
+ lib.searchPageByKeyword = function(keyword) {
|
|
|
+ var queryBody = {
|
|
|
+ query: {
|
|
|
+ bool: {
|
|
|
+ should: [
|
|
|
+ {term: { path: { term: keyword, boost: 2.0 } }},
|
|
|
+ {term: { body: { term: keyword } }}
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ highlight : { fields : { body : {} } },
|
|
|
+ //sort: [{ updated: { order: "desc" } } ]
|
|
|
+ };
|
|
|
+ return client.search({
|
|
|
+ index: index_name,
|
|
|
+ body: queryBody
|
|
|
+ });
|
|
|
+
|
|
|
+ /*
|
|
|
+ {
|
|
|
+ "query": {
|
|
|
+ "bool": {
|
|
|
+ "should": [
|
|
|
+ {"term": {
|
|
|
+ "path": {
|
|
|
+ "term": "php",
|
|
|
+ "boost": 2.0
|
|
|
+ }
|
|
|
+ }},
|
|
|
+ {"term": {
|
|
|
+ "body": {
|
|
|
+ "term": "php"
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "highlight" : {
|
|
|
+ "fields" : {
|
|
|
+ "body" : {}
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "sort": [
|
|
|
+ {
|
|
|
+ "updated": {
|
|
|
+ "order": "desc"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ */
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ lib.searchPageByLikeCount = function() {
|
|
|
+ };
|
|
|
+
|
|
|
+ return lib;
|
|
|
+};
|
|
|
+
|