Discord.js поиск по ключевым словам

1

Я пытаюсь создать бот 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, поэтому я не уверен, как это сделать. Все советы приветствуются, спасибо!

Теги:
discord
bots

1 ответ

1
Лучший ответ

Похоже, то, что вы пытаетесь реализовать, - это механизм под названием 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, вот несколько полезных ссылок

  • 0
    Так как это должно быть реализовано в моем случае? У меня есть SQL-словарь идентификаторов пользователей, а затем для каждого идентификатора массив атрибутов - в настоящее время единственным является массив «предложений», который содержит список предложений. Так должен ли я перебирать массив предложений каждого пользователя, а затем искать его с помощью Fuse?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню