diff options
| -rw-r--r-- | src-migrate/services/product.ts | 3 | ||||
| -rw-r--r-- | src/pages/api/shop/search.js | 28 |
2 files changed, 23 insertions, 8 deletions
diff --git a/src-migrate/services/product.ts b/src-migrate/services/product.ts index a6abba47..77b645f0 100644 --- a/src-migrate/services/product.ts +++ b/src-migrate/services/product.ts @@ -44,7 +44,8 @@ export const getProductSimilar = async ({ `q=${name}`, 'page=1', 'operation=OR', - 'priceFrom=1', + // 'priceFrom=1', + `source=similar`, ]; if (except?.productId) query.push(`fq=-product_id_i:${except.productId}`); diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js index 1b6377f4..550217d8 100644 --- a/src/pages/api/shop/search.js +++ b/src/pages/api/shop/search.js @@ -16,6 +16,7 @@ export default async function handler(req, res) { operation = 'AND', fq = '', limit = 30, + source = '', } = req.query; let { stock = '' } = req.query; @@ -65,7 +66,18 @@ export default async function handler(req, res) { // let newQ = keywords; let checkQ = q.trim().split(/[\s\+\-\!\(\)\{\}\[\]\^"~\*\?:\\\/]+/); - let newQ = checkQ.length > 1 ? escapeSolrQuery(q) + '*' : escapeSolrQuery(q); + let newQ = escapeSolrQuery(q); + + const formattedQuery = `(${newQ.split(' ').map(term => `${term}*`).join(' ') })`; + const mm = checkQ.length > 2 ? checkQ.length > 5 ? '65%' : '85%' : `${checkQ.length}`; + + const filterQueries = [ + '-publish_b:false', + 'product_rating_f:[8 TO *]', + 'price_tier1_v2_f:[1 TO *]' + ]; + + const fq_ = filterQueries.join('AND '); let offset = (page - 1) * limit; let parameter = [ @@ -74,15 +86,15 @@ export default async function handler(req, res) { 'facet=true', 'indent=true', `facet.query=${escapeSolrQuery(q)}`, - `q.op=${operation}`, - `q=${newQ}`, + `q.op=OR`, + `q=${source == 'similar' || checkQ.length < 3 ? newQ + '*' : formattedQuery }`, `defType=edismax`, 'qf=name_s description_clean_t category_name manufacture_name_s variants_code_t variants_name_t category_id_ids default_code_s', `start=${parseInt(offset)}`, `rows=${limit}`, `sort=${paramOrderBy}`, - `fq=-publish_b:false, product_rating_f:[8 TO *], price_tier1_v2_f:[1 TO *]`, - `mm=2` + `fq=${encodeURIComponent(fq_)}`, + `mm=${encodeURIComponent(mm)}`, ]; if (priceFrom > 0 || priceTo > 0) { @@ -120,10 +132,12 @@ export default async function handler(req, res) { if (stock) parameter.push(`fq=stock_total_f:{1 TO *}`); // Single fq in url params - if (typeof fq === 'string') parameter.push(`fq=${fq}`); + if (typeof fq === 'string') parameter.push(`fq=${encodeURIComponent(fq)}`); // Multi fq in url params if (Array.isArray(fq)) - parameter = parameter.concat(fq.map((val) => `fq=${val}`)); + parameter = parameter.concat(fq.map((val) => `fq=${encodeURIComponent(val)}`)); + + console.log('ini params', parameter); let result = await axios( process.env.SOLR_HOST + '/solr/product/select?' + parameter.join('&') |
