Я пытаюсь создать бота Discord для торговли в определенных играх. Пока у меня работает большинство основных команд -! Create создает список сделок в базе данных SQL,! Find находит его, но он находит его только по тому же слову. Я пытаюсь сделать поиск менее конкретным, чтобы термины не обязательно были в точности равны для отображения результатов. Мой текущий код довольно запутан и, разумеется, очень сломан:
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's 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, вот несколько полезных ссылок.
Итак, как это реализовать в моем случае? У меня есть словарь sql идентификаторов пользователей, а затем для каждого идентификатора массив атрибутов - в настоящее время единственный из них - это массив «предложений», который содержит список предложений. Так следует ли мне перебирать массив предложений каждого пользователя, а затем искать его с помощью Fuse?