首先,我不确定问题标题对于该问题是否太笼统,还是应该更改它。
无论如何,如何根据输入的关键字进一步改善PostgreSQL查询以显示更好的搜索结果?
仅当您通过先搜索name
开始搜索时,当前查询才能正常工作。但是,如果尝试输入任何其他关键字后跟名称,搜索将中断并产生意外结果。
async getProducts(opts) {
const query = knex
.select(
'id',
'pharmacy_id',
'name',
'ean_code',
'product_number',
'strength',
'dosage_format',
'packaging_qty',
'prescription_med',
'selling_permit_owner',
'status'
)
.from('product')
.orderBy('id', 'asc');
return camelizeKeys(await queryWithFilters(query, opts));
}
const queryWithFilters = (query, opts) =>
productOpts.reduce((q, opt) => {
let result;
const option = opts[opt];
if (option) {
if (opt.match(/searchText/)) {
const regexp = `(${option
.trim()
.replace(/\s{1,}/, '|')
.toLowerCase()})`;
result = q.where(function() {
this.where(knex.raw('name ~* ?', regexp))
.orWhere(knex.raw('strength ~* ?', regexp))
.orWhere(knex.raw('dosage_format ~* ?', regexp))
.orWhere(knex.raw('packaging_qty ~* ?', regexp))
.orWhere(knex.raw('selling_permit_owner ~* ?', regexp));
});
}
}
return result || q;
}, query);
这就是我在客户端呈现选项的方式
productOptions = () => {
const { products } = this.props;
return products.edges.map(({ node }) => {
const { id, name, strength, dosageFormat, packagingQty } = node;
return (
<Option
key={id}
value={`${id}`}
render={`${name}, ${strength}, ${dosageFormat}, ${packagingQty}`}
style={{ borderBottom: '1px solid #DCDCDC' }}
>
{name} {strength} {dosageFormat} {packagingQty}
</Option>
);
});
};
我对如何进一步改进查询以使其更加宽容并给出更适当的结果有些困惑。
首先-在这里输入burana
可以从数据库中获得所有结果。
第二个-如果我尝试使用burana 400
查找记录,则不能像从第一个屏幕截图中看到的那样恢复预期的结果。
第三-键入400 burana
也应显示适当的搜索结果,但不在我当前的查询中。