Я пытаюсь создать бот Discord для торговли в определенных играх. Пока у меня есть большинство основных команд working--! Create создает торговую запись в базе данных SQL, находит find one - но находит ее только на одном и том же слове. Я пытаюсь сделать поиск менее конкретным, поэтому условия не должны быть точно равны показам результатов. Мой текущий код довольно запутанный и, разумеется, очень сломанный:
var searchTerms = args[1].split(" ");
var output = {};
for (var id in userData) {
for (var offer in userData[id].offers) {
var score = 0;
for (var key in searchTerms) {
if (offer.includes(key)) {
score ++;
}
}
if (score >= searchTerms.length / 2) {
output[id] = userData[id].offers[offer] + " - " + ((score / searchTerms.length) * 100) + "%";
}
}
}
if (output == {}) {
bot.sendMessage({
to: channelID,
message: 'No matching offers found.'
});
} else {
msg = ""
for (id in output) {
msg += '<@' + id + '> - ' + output[id] + " "
}
bot.sendMessage({
to: channelID,
message: Object.keys(output).length + ' offers found: ' + msg
});
}
Я новичок в Javascript, поэтому я не уверен, как это сделать. Все советы приветствуются, спасибо!
Похоже, то, что вы пытаетесь реализовать, - это механизм под названием Fuzzy Search
, который может найти похожие результаты с использованием опечаток или приближенных строк.
(Ссылка: https://en.wikipedia.org/wiki/Approximate_string_matching)
Это не очень простая функция для начинающих программистов для реализации самостоятельно, либо база данных должна поддерживать какой-то нечеткий запрос, либо вам сначала нужно получить все данные из базы данных и использовать библиотеку нечеткого поиска JavaScript для выполните это.
Если вы все еще хотите это сделать, я рекомендую использовать Fuse.js, который способен выполнять нечеткий поиск в нескольких строках
//list to be searched
var books = [{
'ISBN': 'A',
'title': "Old Man War",
'author': 'John Scalzi'
}, {
'ISBN': 'B',
'title': 'The Lock Artist',
'author': 'Steve Hamilton'
}]
// init the search
var options = {
keys: ['title', 'author'],
id: 'ISBN'
}
var fuse = new Fuse(books, options)
fuse.search('old')
// result
[
"A"
]
Нечеткий поиск - сложная проблема компьютерных наук, если вы хотите узнать больше об этом и как реализуется Fuse.js, вот несколько полезных ссылок