如何在Node.js中编写Elasticsearch查询,过滤category为doctor/hospital的记录
嘿,我来帮你搞定这个Elasticsearch查询的调整~
首先得指出你原代码里的一个小问题:Elasticsearch的复合查询必须用bool对象来包裹must和filter,你之前直接把这两个放在query根节点下是不符合语法的,这会导致过滤逻辑根本不生效哦。
接下来,要实现“仅筛选category为doctor或hospital的记录”,我们需要做两处关键调整:
1. 修正查询结构(必做)
把原来的查询结构改成bool查询,让must(负责匹配搜索关键词)和filter(负责过滤分类)能正确协同工作。
2. 设置精准的过滤条件
首先要注意:你的示例文档里存储的分类字段是小写的category,但原代码里用的是大写的Category,这会导致过滤完全找不到数据,必须改成和ES中一致的字段名!
如果是无论其他参数如何,强制只返回doctor和hospital类别的记录,那直接把过滤条件固定成category: ['doctor', 'hospital'];如果是仅当docorhosp参数存在时才应用这个过滤,那保留原来的if-else逻辑,但要修正字段名。
下面是修改后的完整代码片段(以强制过滤doctor/hospital为例):
// 这里可以根据你的业务需求调整,比如保留原有的参数判断逻辑,只要确保filterQuery的字段名正确即可 const filterQuery = { category: ['doctor', 'hospital'] }; client.search({ index: 'xpertdox', // 注意:如果doctor/hospital的文档类型不是disease,这里需要改成对应的type,或者设置为数组比如['disease', 'doctor', 'hospital'] type: 'disease', size: 20, body: { query: { bool: { must: { match: { name: { query: searchString, fuzziness: 2, operator: "or" } } }, filter: { terms: filterQuery } } } } }).then(function (resp) { var data = resp.hits.hits; if (isFromSsr) { data = helper.prepareSearchDataForSsr(data); } res.json(data); });
额外提醒:如果你的doctor和hospital数据存在不同的文档类型(type)下,那当前的type: 'disease'会限制查询范围,导致查不到这些数据,这时候需要把type参数改成包含对应类型的数组,或者去掉type参数查询整个索引。
内容的提问来源于stack exchange,提问作者PSPK
相关产品推荐
相关产品推荐

