我已经使用NodeJS Server设置了elasticsearch,并且需要一个有效的布尔查询来检查搜索中的不同条件。该怎么做?
我正在将Mongoosastic(查询DSL)与NodeJS和以下查询结合使用以获取结果
映射功能
shared
查询功能
async function mapMongoToElastic() {
return new Promise((resolve, reject) => {
console.log("---------Mapping gets created---------");
Product.createMapping(
{
mappings: {
product: {
properties: {
ArtNumber: { type: "text" },
Title: {
type: "text",
fields: {
keyword: {
type: "keyword"
}
}
},
DisplayPrice: { type: "double" },
CF_Deliverytime: { type: "text" },
Description_Short: { type: "text" },
MainCat: {
type: "text",
fields: {
keyword: {
type: "keyword"
}
}
},
ItemCat: {
type: "text",
fields: {
keyword: {
type: "keyword"
}
}
},
Deeplink1: { type: "text" },
Img_url: { type: "text" },
CF_img_url2: { type: "text" },
CF_img_url3: { type: "text" },
CF_Availability: { type: "text" },
CF_Productrating: {
type: "text",
fields: {
keyword: {
type: "keyword"
}
}
},
CF_Discount: {
type: "text",
fields: {
keyword: {
type: "keyword"
}
}
},
Shop: {
type: "text",
fields: {
keyword: {
type: "keyword"
}
}
}
}
}
}
},
function(err, mapping) {
if (err) {
console.log("error creating mapping (you can safely ignore this)");
console.log(err);
resolve(err);
} else {
console.log("X - ElasticSearch Mapping Created");
resolve(mapping);
}
}
);
});
}
预期结果: -查询“电视”
结果: 产品名称为“ TV” -如果“类别”也有“电视”,则将其排名更高。
问题: 如果搜索“电视”,也会列出Smart-TV-Controller,但是如果有人正在搜索“电视”,则不会列出Smart-TV-Controller
帮助表示赞赏。
答案 0 :(得分:0)
似乎您正在尝试获得完全匹配。对于字段keyword
和Title
,您已经具有ItemCat
类型的子字段。因此,请在匹配查询中使用关键字字段。
query: {
multi_match: {
query: query.suche,
fields: [ "Title.keyword^10", "ItemCat.keyword^5" ]
}
}
如果您不希望在Title
中查找完全匹配,则另一种方法是设置字段,如下所示:
fields: [ "Title^10", "ItemCat.keyword^5" ]