Elasticsearch boost文档,其中全文查询子字符串与字段完全匹配

zphenhs4  于 2023-03-29  发布在  ElasticSearch
关注(0)|答案(1)|浏览(134)

我使用的是Elasticsearch 8.6,我试图在全文搜索中提升文档,其中字段的值正好包含在查询文本中,换句话说,其中字段正好是查询的子字符串。
例如,假设我有这些文档:

{
  "id": 1,
  "title": "Kids t-shirts",
  "category": "Kids clothes"
},
{
  "id": 2,
  "title": "All about kids",
  "category": ""
}

假设我根据title字段搜索kids,并且文档以#2,#1的顺序返回。到目前为止,这很好!
这就是我被卡住的地方:
如果查询***包含***category的确切名称-例如blue kids clothes,我想提升类别与查询匹配的文档-在本例中为#1。
我尝试过在category字段上使用额外的matchmatch_phrase查询来提升,但是效果不好,例如,现在搜索kids也会触发文档#1的提升,因为kids和类别kids clothes之间的匹配分数是正的。
完全匹配也不起作用--这是一种错误的方式。我希望blue kids clothes基于类别kids clothes是查询的完全子串来触发boost,但完全匹配只会在查询完全是kids clothes时才会触发boost。
为了澄清,以下是我希望触发提升的一些情况:
| 查询文本|#1是否应该增加文档?|
| --------------|--------------|
| 童装|(类别与查询完全匹配)|
| 蓝色童装|(具体类别包含在查询中)|
| 儿童|(不完全匹配)|
| 儿童服装|(类别中的两个词都在查询中,但顺序错误=没有完全匹配)|
(Doc#2永远不应该被提升,因为它的category字段是空的)
任何建议或指导将非常感谢!

jogvjijk

jogvjijk1#

我能够做到这一点的一种方法是使用自定义script_score

{
  "script_score": {
    "query": {
      "match": {
        "category": "blue kids clothes"
      }
    },
    "script": {
      "source": "params.query.contains(doc['category.keyword'].value) ? 1.0 : 0.0",
      "params": {
        "query": "blue kids clothes"
      }
    }
  }
}

很高兴听到其他答案!

相关问题