52 lines
1.2 KiB
JavaScript

export function queryString(str) {
const normalizedString = normalizeWhitespace(str)
const escapedString = escapeSpecialCharacters(normalizedString)
return `
${matchWholeText(escapedString)}
${matchEachWordExactly(escapedString)}
${matchSomeWordsExactly(escapedString)}
${matchBeginningOfWords(escapedString)}
`
}
const matchWholeText = (str, boost = 8) => {
return `"${str}"^${boost}`
}
const matchEachWordExactly = (str, boost = 4) => {
if (!str.includes(' ')) return ''
const tmp = str
.split(' ')
.map((s, i) => (i === 0 ? `"${s}"` : `AND "${s}"`))
.join(' ')
return `(${tmp})^${boost}`
}
const matchSomeWordsExactly = (str, boost = 2) => {
if (!str.includes(' ')) return ''
return str
.split(' ')
.map((s) => `"${s}"^${boost}`)
.join(' ')
}
const matchBeginningOfWords = (str) => {
return str
.split(' ')
.filter((s) => s.length >= 2)
.map((s) => s + '*')
.join(' ')
}
export function normalizeWhitespace(str) {
// delete the first character if it is !, @ or #
return str
.replace(/^([!@#])/, '')
.replace(/\s+/g, ' ')
.trim()
}
export function escapeSpecialCharacters(str) {
return str.replace(/(["[\]&|\\{}+!()^~*?:/-])/g, '\\$1')
}