【问题标题】:Node.js Sequelize Postgres related search functionNode.js Sequelize Postgres 相关搜索功能
【发布时间】:2022-01-05 04:38:55
【问题描述】:

我正在尝试创建一个搜索功能,该功能还可以显示相关搜索。例如。如果我尝试搜索“树”,那么它必须找到所有包含树的行。我也打错了它,它必须向我展示一些结果。例如。 'treesabc' 那么它也必须向我展示一些结果。现在我正在使用 Like 方法,它满足了我的第一个需求,但在输入附加字母时它确实有效。

这是我的代码。

exports.quickSearch = async (req, res) => {
  let services = [];
  // finding all services which matches the condition
  let serviceData = await Service.findAll({
    limit: 300, //  limiting the number of search

    where: {
      // here i want to to do something which can also show related searches
      [Op.or]: [
        {
          service_name: sequelize.where(
            sequelize.fn("LOWER", sequelize.col("service_name")),
            "LIKE",
            "%" + req.params.keyword.toLowerCase() + "%",
          ),
        },
        {
          category: sequelize.where(
            sequelize.fn("LOWER", sequelize.col("category")),
            "LIKE",
            "%" + req.params.keyword.toLowerCase() + "%",
          ),
        },
        {
          sub_category: sequelize.where(
            sequelize.fn("LOWER", sequelize.col("sub_category")),
            "LIKE",
            "%" + req.params.keyword.toLowerCase() + "%",
          ),
        },
        {
          master_category: sequelize.where(
            sequelize.fn("LOWER", sequelize.col("master_category")),
            "LIKE",
            "%" + req.params.keyword.toLowerCase() + "%",
          ),
        },
        {
          gender: sequelize.where(
            sequelize.fn("LOWER", sequelize.col("gender")),
            "LIKE",
            "%" + req.params.keyword.toLowerCase() + "%",
          ),
        },
      ],
    },
  });
  // custom function asyncForEach
  const asyncForEach = async (array, callback) => {
    for (let i = 0; i < array.length; i++) {
      await callback(array[i]);
    }
  };
  await asyncForEach(serviceData, async (service) => {
//  trying to find all te partner which has service_id
    let partnerData = await Partner.findOne({
      where: {
        partner_id: service.partner_id,
        banned: false,
      },
      raw: true,
    });

    if (partnerData) {
      // inserting partners data in service
      partnerData.password = null;
      service.dataValues.outletdata = partnerData;
      services.push(service);
    }
  });
  
  return res
    .status(200)
    .json({ message: "Success", services});
};

【问题讨论】:

    标签: javascript node.js postgresql sequelize.js


    【解决方案1】:

    试试Op.like:

    例子:

    queryParams.where = {
     [Op.or]: [
      Sequelize.where(Sequelize.fn('lower', Sequelize.col('t_device.name')), {
       [Op.like]: `%${optionsWithDefault.search}%`,
      }),
      Sequelize.where(Sequelize.fn('lower', Sequelize.col('t_device.external_id')), {
       [Op.like]: `%${optionsWithDefault.search}%`,
      }),
    

    参考链接:https://www.tabnine.com/code/javascript/functions/sequelize/SequelizeStatic/fn

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多