|  | @@ -57,11 +57,12 @@ module.exports = {
 | 
	
		
			
				|  |  |            const idxBody = {
 | 
	
		
			
				|  |  |              properties: {
 | 
	
		
			
				|  |  |                suggest: { type: 'completion' },
 | 
	
		
			
				|  |  | -              title: { type: 'text', boost: 4.0 },
 | 
	
		
			
				|  |  | +              title: { type: 'text', boost: 10.0 },
 | 
	
		
			
				|  |  |                description: { type: 'text', boost: 3.0 },
 | 
	
		
			
				|  |  |                content: { type: 'text', boost: 1.0 },
 | 
	
		
			
				|  |  |                locale: { type: 'keyword' },
 | 
	
		
			
				|  |  | -              path: { type: 'text' }
 | 
	
		
			
				|  |  | +              path: { type: 'text' },
 | 
	
		
			
				|  |  | +              tags: { type: 'text', boost: 8.0 }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |            await this.client.indices.create({
 | 
	
	
		
			
				|  | @@ -92,26 +93,11 @@ module.exports = {
 | 
	
		
			
				|  |  |          index: this.config.indexName,
 | 
	
		
			
				|  |  |          body: {
 | 
	
		
			
				|  |  |            query: {
 | 
	
		
			
				|  |  | -            bool: {
 | 
	
		
			
				|  |  | -              filter: [
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                  bool: {
 | 
	
		
			
				|  |  | -                    should: [
 | 
	
		
			
				|  |  | -                      {
 | 
	
		
			
				|  |  | -                        simple_query_string: {
 | 
	
		
			
				|  |  | -                          query: q
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                      },
 | 
	
		
			
				|  |  | -                      {
 | 
	
		
			
				|  |  | -                        query_string: {
 | 
	
		
			
				|  |  | -                          query: `*${q}*`
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                      }
 | 
	
		
			
				|  |  | -                    ],
 | 
	
		
			
				|  |  | -                    minimum_should_match: 1
 | 
	
		
			
				|  |  | -                  }
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -              ]
 | 
	
		
			
				|  |  | +            simple_query_string: {
 | 
	
		
			
				|  |  | +              query: `*${q}*`,
 | 
	
		
			
				|  |  | +              fields: ['title^20', 'description^3', 'tags^8', 'content^1'],
 | 
	
		
			
				|  |  | +              default_operator: 'and',
 | 
	
		
			
				|  |  | +              analyze_wildcard: true
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |            },
 | 
	
		
			
				|  |  |            from: 0,
 | 
	
	
		
			
				|  | @@ -145,14 +131,26 @@ module.exports = {
 | 
	
		
			
				|  |  |        WIKI.logger.warn('Search Engine Error: ', _.get(err, 'meta.body.error', err))
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * Build tags field
 | 
	
		
			
				|  |  | +   * @param id
 | 
	
		
			
				|  |  | +   * @returns {Promise<*|*[]>}
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  async buildTags(id) {
 | 
	
		
			
				|  |  | +    const tags = await WIKI.models.pages.query().findById(id).select('*').withGraphJoined('tags')
 | 
	
		
			
				|  |  | +    return (tags.tags && tags.tags.length > 0) ? tags.tags.map(function (tag) {
 | 
	
		
			
				|  |  | +      return tag.title
 | 
	
		
			
				|  |  | +    }) : []
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  |    /**
 | 
	
		
			
				|  |  |     * Build suggest field
 | 
	
		
			
				|  |  |     */
 | 
	
		
			
				|  |  |    buildSuggest(page) {
 | 
	
		
			
				|  |  | -    return _.uniq(_.concat(
 | 
	
		
			
				|  |  | +    return _.reject(_.uniq(_.concat(
 | 
	
		
			
				|  |  |        page.title.split(' ').map(s => ({
 | 
	
		
			
				|  |  |          input: s,
 | 
	
		
			
				|  |  | -        weight: 4
 | 
	
		
			
				|  |  | +        weight: 10
 | 
	
		
			
				|  |  |        })),
 | 
	
		
			
				|  |  |        page.description.split(' ').map(s => ({
 | 
	
		
			
				|  |  |          input: s,
 | 
	
	
		
			
				|  | @@ -162,7 +160,7 @@ module.exports = {
 | 
	
		
			
				|  |  |          input: s,
 | 
	
		
			
				|  |  |          weight: 1
 | 
	
		
			
				|  |  |        }))
 | 
	
		
			
				|  |  | -    ))
 | 
	
		
			
				|  |  | +    )), ['input', ''])
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  |    /**
 | 
	
		
			
				|  |  |     * CREATE
 | 
	
	
		
			
				|  | @@ -180,7 +178,8 @@ module.exports = {
 | 
	
		
			
				|  |  |          path: page.path,
 | 
	
		
			
				|  |  |          title: page.title,
 | 
	
		
			
				|  |  |          description: page.description,
 | 
	
		
			
				|  |  | -        content: page.safeContent
 | 
	
		
			
				|  |  | +        content: page.safeContent,
 | 
	
		
			
				|  |  | +        tags: await this.buildTags(page.id)
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |        refresh: true
 | 
	
		
			
				|  |  |      })
 | 
	
	
		
			
				|  | @@ -201,7 +200,8 @@ module.exports = {
 | 
	
		
			
				|  |  |          path: page.path,
 | 
	
		
			
				|  |  |          title: page.title,
 | 
	
		
			
				|  |  |          description: page.description,
 | 
	
		
			
				|  |  | -        content: page.safeContent
 | 
	
		
			
				|  |  | +        content: page.safeContent,
 | 
	
		
			
				|  |  | +        tags: await this.buildTags(page.id)
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |        refresh: true
 | 
	
		
			
				|  |  |      })
 | 
	
	
		
			
				|  | @@ -241,7 +241,8 @@ module.exports = {
 | 
	
		
			
				|  |  |          path: page.destinationPath,
 | 
	
		
			
				|  |  |          title: page.title,
 | 
	
		
			
				|  |  |          description: page.description,
 | 
	
		
			
				|  |  | -        content: page.safeContent
 | 
	
		
			
				|  |  | +        content: page.safeContent,
 | 
	
		
			
				|  |  | +        tags: await this.buildTags(page.id)
 | 
	
		
			
				|  |  |        },
 | 
	
		
			
				|  |  |        refresh: true
 | 
	
		
			
				|  |  |      })
 | 
	
	
		
			
				|  | @@ -266,6 +267,7 @@ module.exports = {
 | 
	
		
			
				|  |  |          if (doc) {
 | 
	
		
			
				|  |  |            const docBytes = Buffer.from(JSON.stringify(doc)).byteLength
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +          doc['tags'] = await this.buildTags(doc.realId)
 | 
	
		
			
				|  |  |            // -> Current batch exceeds size limit, flush
 | 
	
		
			
				|  |  |            if (docBytes + COMMA_BYTES + bytes >= MAX_INDEXING_BYTES) {
 | 
	
		
			
				|  |  |              await flushBuffer()
 | 
	
	
		
			
				|  | @@ -307,6 +309,7 @@ module.exports = {
 | 
	
		
			
				|  |  |              doc.safeContent = WIKI.models.pages.cleanHTML(doc.render)
 | 
	
		
			
				|  |  |              result.push({
 | 
	
		
			
				|  |  |                suggest: this.buildSuggest(doc),
 | 
	
		
			
				|  |  | +              tags: doc.tags,
 | 
	
		
			
				|  |  |                locale: doc.locale,
 | 
	
		
			
				|  |  |                path: doc.path,
 | 
	
		
			
				|  |  |                title: doc.title,
 | 
	
	
		
			
				|  | @@ -324,8 +327,9 @@ module.exports = {
 | 
	
		
			
				|  |  |        bytes = 0
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    // Added real id in order to fetch page tags from the query
 | 
	
		
			
				|  |  |      await pipeline(
 | 
	
		
			
				|  |  | -      WIKI.models.knex.column({ id: 'hash' }, 'path', { locale: 'localeCode' }, 'title', 'description', 'render').select().from('pages').where({
 | 
	
		
			
				|  |  | +      WIKI.models.knex.column({ id: 'hash' }, 'path', { locale: 'localeCode' }, 'title', 'description', 'render', { realId: 'id' }).select().from('pages').where({
 | 
	
		
			
				|  |  |          isPublished: true,
 | 
	
		
			
				|  |  |          isPrivate: false
 | 
	
		
			
				|  |  |        }).stream(),
 |