我有一个来自usda的25万种食物的数据库,已复制到Elasticsearch中。人们通过名字搜索食物。对于某些查询,例如“面粉”,我想始终先显示一种特定的面粉。我想为此做大约100个常见项目。大多数项目都可以正常搜索结果。
但是,对于其他查询,例如“杏仁粉”,我希望始终先显示一个不同的结果。 (每种类型的面粉有很多品种,我需要对哪种面粉最适合给定的通用查询进行控制。
仅当搜索查询与正则表达式匹配时,才可以增强结果吗?例如,我的食品弹性搜索文档还可以包含必须与搜索查询匹配的正则表达式,以便进行提升。 示例es doc:
{
"name": "Pork, cured, salt pork, raw",
"boostRegex": "/^pork$/i"
}
否则,仅当搜索查询与文档中的关键字完全匹配时,才有能力提升结果吗?我尝试了这种方法,但似乎无法使boostKeyword完全匹配。例如,如果一项是boostKeyword:“杏仁粉”,另一项是boostKeyword:“椰子粉”,而搜索查询是“面粉”-如果boost关键字匹配,则两者都会得到增强。 示例:
{
"name": "Flours, almond, blanched",
"boostKeyword": "almond flour"
},
{
"name": "Flours, coconut, fine",
"boostKeyword": "coconut flour"
},
我用于此问题的示例查询
"query": {
"bool": {
"must": {
"match": {
"name": searchQuery
}
},
"should" : [
{
"match" : {
"boostKeyword" : {
"query" : searchQuery,
"boost": 10
}
}
}
]
}
}
答案 0 :(得分:0)
在查询elasticsearch之前,我最终创建了一个从中执行查询的辅助数据库来完成此任务。我宁愿只将这些数据存储在elasticsearch项目的文档中,并在查询时将其与某种脚本一起使用以执行增强功能。但这会做到的。
辅助数据库(实际上是一个Firebase Firestore集合)包含我要提升的项目的正则表达式,以及在Elasticsearch查询期间应提升的项目的ID号。
在执行Elasticsearch查询之前,我将查询该数据库并返回所有正则表达式。对于与搜索字词匹配的每个表达式,我都会为Elasticsearch查询添加一个数组“ should / or”语句。
should语句会增强所有包含匹配ID号的搜索结果。
"body": {
"query": {
"bool": {
"must": {
"match": {
"name": searchQuery,
}
},
"should" : [
boostArray
]
}
}
}
提升数组: 我生成了一个像这样的对象数组,它们被简单地包含在elasticsearch查询中的“ should”数组中(见上文)。如果我有多个应针对给定查询提升的项目,则此方法适用。
let boostArray = {
"match" : {
"sourceId" : {
"query" : "14091",
"boost": 1
}
}
},
{
"match" : {
"sourceId" : {
"query" : "14016",
"boost": 1
}
}
}