簡體   English   中英

Node.js Sequelize Postgres 相關搜索 function

[英]Node.js Sequelize Postgres related search function

我正在嘗試創建一個搜索 function 也可以顯示相關搜索。 例如。 如果我嘗試搜索“樹”,那么它必須找到所有包含樹的行。 我也打錯了它,它必須向我展示一些結果。 例如。 '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});
};

嘗試使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM