【问题标题】:Elasticsearch Boost Specific Result Only For Specific QueryElasticsearch 仅针对特定查询提升特定结果
【发布时间】:2018-07-20 18:07:06
【问题描述】:

我有一个来自美国农业部的 250,000 种食物的数据库,复制到 Elasticsearch 中。人们按名称搜索食物。对于诸如“面粉”之类的某些查询,我希望始终首先出现一种特定的面粉。我想为大约 100 个常见项目执行此操作。大多数项目都可以正常搜索结果。

但是,对于其他查询,例如“杏仁粉”,我希望始终首先显示不同的结果。 (每种面粉种类繁多,我需要控制哪种面粉最适合给定的通用查询)。

是否只有当搜索查询匹配正则表达式时才能提升结果?例如,我的食品项目的弹性搜索文档还可以包含必须匹配搜索查询的正则表达式,以便进行提升。 示例文档:

{
  "name": "Pork, cured, salt pork, raw",
  "boostRegex": "/^pork$/i"
}

否则,是否只有当搜索查询与文档中的关键字完全匹配时才能提升结果?我尝试了这种方法,但我似乎无法使 boostKeyword 精确匹配工作。例如,如果一项是 boostKeyword:“almond flour”,另一项是 boostKeyword:“coconut flour”,并且搜索查询是“flour”——如果 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
                  }
              }
            }
        ]
    }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我最终通过在查询 elasticsearch 之前创建一个执行查找的辅助数据库来完成此操作。我宁愿只将这些数据存储在弹性搜索项目的文档中,并在查询时使用它和某种脚本来执行提升。但是这样就可以了。

    辅助数据库(它实际上是一个 firebase firestore 集合)包含我想要提升的项目的正则表达式,以及在 elasticsearch 查询期间应该提升的项目的 ID 号。

    在我的 elasticsearch 查询之前,我查询了这个数据库并返回所有的正则表达式。对于与我的搜索词匹配的每个表达式,我将添加到 elasticsearch 查询的“应该/或”语句数组中。

    should 语句会提升任何包含匹配 ID 号的搜索结果。

    "body": {
        "query": {
            "bool": {
                "must": {
                    "match": {
                        "name": searchQuery,
                    }
                },
                "should" : [
                    boostArray
                ]
            }
        }
    }

    提升阵列: 我生成了一个这样的对象数组,它们简单地包含在 elasticsearch 查询的“应该”数组中(见上文)。这适用于如果我有多个项目应该针对给定查询进行提升。

    let boostArray = {
        "match" : {
            "sourceId" : {
                "query" : "14091",
                "boost": 1
            }
        }
    },
    {
        "match" : {
            "sourceId" : {
                "query" : "14016",
                "boost": 1
            }
        }
    }

    【讨论】:

      猜你喜欢
      • 2017-06-16
      • 2014-01-01
      • 1970-01-01
      • 2020-08-18
      • 2021-07-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多