mirror of https://github.com/requarks/wiki
parent
f7664339f4
commit
21ee8c0c0b
@ -0,0 +1,12 @@
|
|||||||
|
mutation {
|
||||||
|
search {
|
||||||
|
rebuildIndex {
|
||||||
|
responseResult {
|
||||||
|
succeeded
|
||||||
|
errorCode
|
||||||
|
slug
|
||||||
|
message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,26 +1,213 @@
|
|||||||
module.exports = {
|
const _ = require('lodash')
|
||||||
activate() {
|
const { SearchService, QueryType } = require('azure-search-client')
|
||||||
|
const request = require('request-promise')
|
||||||
|
const { pipeline } = require('stream')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
async activate() {
|
||||||
|
// not used
|
||||||
},
|
},
|
||||||
deactivate() {
|
async deactivate() {
|
||||||
|
// not used
|
||||||
},
|
},
|
||||||
query() {
|
/**
|
||||||
|
* INIT
|
||||||
|
*/
|
||||||
|
async init() {
|
||||||
|
this.client = new SearchService(this.config.serviceName, this.config.adminKey)
|
||||||
|
|
||||||
|
// -> Create Search Index
|
||||||
|
const indexes = await this.client.indexes.list()
|
||||||
|
if (!_.find(_.get(indexes, 'result.value', []), ['name', this.config.indexName])) {
|
||||||
|
await this.client.indexes.create({
|
||||||
|
name: this.config.indexName,
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
name: 'id',
|
||||||
|
type: 'Edm.String',
|
||||||
|
key: true,
|
||||||
|
searchable: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'locale',
|
||||||
|
type: 'Edm.String',
|
||||||
|
searchable: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'path',
|
||||||
|
type: 'Edm.String',
|
||||||
|
searchable: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'title',
|
||||||
|
type: 'Edm.String',
|
||||||
|
searchable: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
type: 'Edm.String',
|
||||||
|
searchable: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'content',
|
||||||
|
type: 'Edm.String',
|
||||||
|
searchable: true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
scoringProfiles: [
|
||||||
|
{
|
||||||
|
name: 'fieldWeights',
|
||||||
|
text: {
|
||||||
|
weights: {
|
||||||
|
title: 4,
|
||||||
|
description: 3,
|
||||||
|
content: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
suggesters: [
|
||||||
|
{
|
||||||
|
name: 'suggestions',
|
||||||
|
searchMode: 'analyzingInfixMatching',
|
||||||
|
sourceFields: ['title', 'description', 'content']
|
||||||
|
}
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
},
|
},
|
||||||
created() {
|
/**
|
||||||
|
* QUERY
|
||||||
|
*
|
||||||
|
* @param {String} q Query
|
||||||
|
* @param {Object} opts Additional options
|
||||||
|
*/
|
||||||
|
async query(q, opts) {
|
||||||
|
try {
|
||||||
|
let suggestions = []
|
||||||
|
const results = await this.client.indexes.use(this.config.indexName).search({
|
||||||
|
count: true,
|
||||||
|
scoringProfile: 'fieldWeights',
|
||||||
|
search: q,
|
||||||
|
select: 'id, locale, path, title, description',
|
||||||
|
queryType: QueryType.simple,
|
||||||
|
top: 50
|
||||||
|
})
|
||||||
|
if (results.result.value.length < 5) {
|
||||||
|
// Using plain request, not yet available in library...
|
||||||
|
try {
|
||||||
|
const suggestResults = await request({
|
||||||
|
uri: `https://${this.config.serviceName}.search.windows.net/indexes/${this.config.indexName}/docs/autocomplete`,
|
||||||
|
method: 'post',
|
||||||
|
qs: {
|
||||||
|
'api-version': '2017-11-11-Preview'
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
'api-key': this.config.adminKey,
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
json: true,
|
||||||
|
body: {
|
||||||
|
autocompleteMode: 'oneTermWithContext',
|
||||||
|
search: q,
|
||||||
|
suggesterName: 'suggestions'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
suggestions = suggestResults.value.map(s => s.queryPlusText)
|
||||||
|
} catch (err) {
|
||||||
|
WIKI.logger.warn('Search Engine suggestion failure: ', err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
results: results.result.value,
|
||||||
|
suggestions,
|
||||||
|
totalHits: results.result['@odata.count']
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
WIKI.logger.warn('Search Engine Error:')
|
||||||
|
WIKI.logger.warn(err)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
updated() {
|
/**
|
||||||
|
* CREATE
|
||||||
|
*
|
||||||
|
* @param {Object} page Page to create
|
||||||
|
*/
|
||||||
|
async created(page) {
|
||||||
|
await this.client.indexes.use(this.config.indexName).index([
|
||||||
|
{
|
||||||
|
id: page.hash,
|
||||||
|
locale: page.localeCode,
|
||||||
|
path: page.path,
|
||||||
|
title: page.title,
|
||||||
|
description: page.description,
|
||||||
|
content: page.content
|
||||||
|
}
|
||||||
|
])
|
||||||
},
|
},
|
||||||
deleted() {
|
/**
|
||||||
|
* UPDATE
|
||||||
|
*
|
||||||
|
* @param {Object} page Page to update
|
||||||
|
*/
|
||||||
|
async updated(page) {
|
||||||
|
await this.client.indexes.use(this.config.indexName).index([
|
||||||
|
{
|
||||||
|
id: page.hash,
|
||||||
|
locale: page.localeCode,
|
||||||
|
path: page.path,
|
||||||
|
title: page.title,
|
||||||
|
description: page.description,
|
||||||
|
content: page.content
|
||||||
|
}
|
||||||
|
])
|
||||||
},
|
},
|
||||||
renamed() {
|
/**
|
||||||
|
* DELETE
|
||||||
|
*
|
||||||
|
* @param {Object} page Page to delete
|
||||||
|
*/
|
||||||
|
async deleted(page) {
|
||||||
|
await this.client.indexes.use(this.config.indexName).index([
|
||||||
|
{
|
||||||
|
'@search.action': 'delete',
|
||||||
|
id: page.hash
|
||||||
|
}
|
||||||
|
])
|
||||||
},
|
},
|
||||||
rebuild() {
|
/**
|
||||||
|
* RENAME
|
||||||
|
*
|
||||||
|
* @param {Object} page Page to rename
|
||||||
|
*/
|
||||||
|
async renamed(page) {
|
||||||
|
await this.client.indexes.use(this.config.indexName).index([
|
||||||
|
{
|
||||||
|
'@search.action': 'delete',
|
||||||
|
id: page.sourceHash
|
||||||
|
}
|
||||||
|
])
|
||||||
|
await this.client.indexes.use(this.config.indexName).index([
|
||||||
|
{
|
||||||
|
id: page.destinationHash,
|
||||||
|
locale: page.localeCode,
|
||||||
|
path: page.destinationPath,
|
||||||
|
title: page.title,
|
||||||
|
description: page.description,
|
||||||
|
content: page.content
|
||||||
|
}
|
||||||
|
])
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* REBUILD INDEX
|
||||||
|
*/
|
||||||
|
async rebuild() {
|
||||||
|
await pipeline(
|
||||||
|
WIKI.models.knex.column({ id: 'hash' }, 'path', { locale: 'localeCode' }, 'title', 'description', 'content').select().from('pages').where({
|
||||||
|
isPublished: true,
|
||||||
|
isPrivate: false
|
||||||
|
}).stream(),
|
||||||
|
this.client.indexes.use(this.config.indexName).createIndexingStream()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in new issue