elasticsearch得分从0到1,用于搜索与现有文档相似的文档

yquaqz18  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(293)

在搜索与现有文档相似的文档时,需要计算从0到1的相对分数吗?因此,现有文档的得分为1,所有其他匹配文档的得分应根据此计算,得分将<=1。但是现有文档应该从搜索中排除。有没有可能在elasticsearch方面做到这一点,而不仅仅是用如下编程语言手动计算分数:

match_doc_score/search_doc_score

假设我们有索引 person 使用Map:

{
  "properties": {
    "person_id": {
      "type": "keyword"
    },
    "fullname": {
      "type": "text"
    },
    "email": {
      "type": "keyword"
    },
    "phone": {
      "type": "keyword"
    },
    "country_of_birth": {
      "type": "keyword"
    }
  }
}

索引里有三个人:第一个人:

{
  "person_id": 1,
  "fullname": "John Snow",
  "email": "john@gmail.com",
  "phone": "111-11-11",
  "country_of_birth": "Denmark"
}

人员2:

{
  "person_id": 2,
  "fullname": "Snow John",
  "email": "john@gmail.com",
  "phone": "222-22-22",
  "country_of_birth": "Denmark"
}

人员3:

{
  "person_id": 3,
  "fullname": "Peter Wislow",
  "email": "peter@gmail.com",
  "phone": "111-11-11",
  "country_of_birth": "Denmark"
}

通过此查询,我们可以找到与人1相似的人:

{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "fullname": {
                            "query": "John Snow",
                            "boost": 6
                        }
                    }
                },
                {
                    "term": {
                        "email": {
                            "value": "john@gmail.com",
                            "boost": 5
                        }
                    }
                },
                {
                    "term": {
                        "phone": {
                            "value": "111-11-11",
                            "boost": 4
                        }
                    }
                },
                {
                    "term": {
                        "country_of_birth": {
                            "value": "Denmark",
                            "boost": 2
                        }
                    }
                }
            ],
            "must_not": [
                {
                    "term": {
                        "person_id": 123
                    }
                }
            ]
        }
    }
}

如你所见:
个人1和个人2的匹配方式:全名、电子邮件、出生国。
第1人和第3人的匹配方式:电话、出生国。
如果我们在索引中有完全匹配的订单(人1),是否可能有0..1分?
我知道有一个更像这样的查询,但在现实生活中搜索查询可能很复杂,所以 more_like_this 不是一个好的选择。甚至elasticsearch文档也指出,如果您需要对查询进行更多的控制,那么可以使用布尔查询组合。

goqiplq2

goqiplq21#

尚未尝试,但看起来函数得分的字段值因子可能会解决您的查询。

相关问题