gpt4 book ai didi

Elasticsearch 通过嵌套查询提高分数

转载 作者:行者123 更新时间:2023-12-03 03:32:58 27 4
gpt4 key购买 nike

我在 Elasticsearch 版本 1.3.4 中有以下查询:

{
"filtered": {
"query": {
"bool": {
"should": [
{
"bool": {
"should": [
{
"match_phrase": {
"_all": "java"
}
},
{
"bool": {
"should": [
{
"match_phrase": {
"_all": "adobe creative suite"
}
}
]
}
}
]
}
},
{
"bool": {
"should": [
{
"nested": {
"path": "skills",
"query": {
"bool": {
"must": [
{
"term": {
"skills.name.original": "java"
}
},
{
"bool": {
"should": [
{
"match": {
"skills.source": {
"query": "linkedin",
"boost": 5
}
}
},
{
"match": {
"skills.source": {
"query": "meetup",
"boost": 5
}
}
}
]
}
}
],
"minimum_should_match": "100%"
}
}
}
}
]
}
}
],
"minimum_should_match": "100%"
}
},
"filter": {
"and": [
{
"bool": {
"should": [
{
"term": {
"skills.name.original": "java"
}
}
]
}
},
{
"bool": {
"should": [
{
"term": {
"skills.name.original": "ajax"
}
},
{
"term": {
"skills.name.original": "html"
}
}
]
}
}
]
}
}
}

映射如下所示:

  skills: {
type: "nested",
include_in_parent: true,
properties: {
name: {
type: "multi_field",
fields: {
name: {type: "string"},
original: {type : "string", analyzer : "string_lowercase"}
}
}
}
}

最后,技能的文档结构(不包括其他部分)如下所示:

  "skills": 
[
{
"name": "java",
"source": [
"linkedin",
"facebook"
]
},
{
"name": "html",
"source": [
"meetup"
]
}
]

我对这个查询的目标是,首先使用过滤器(查询底部)过滤掉一些不相关的命中,然后通过在整个文档中搜索 match_phrase“java” 来对一个人进行评分,如果它还包含match_phrase“adobecreativesuit”,然后检查“技能”中命中的嵌套值,以查看该技能来自哪种“来源”。然后根据嵌套对象具有的一个或多个源来增强查询。

这样的作品,至少我没有收到任何错误,但最终的分数很奇怪,很难看出它是否有效。如果我给予一个小的提升,比如说 2,分数会稍微下降,我目前的热门歌曲的分数为 32.176407,提升 = 1。如果提升为 5,分数会下降到 31.637703。我预计它会上涨,而不是下跌?增加 1000 分后,分数降至 2.433376。

这是执行此操作的正确方法,还是有更好/更简单的方法?我可以更改结构和映射等。为什么我的分数会下降?

编辑:我稍微简化了查询,只处理一项“技能”:

{
"filtered": {
"query": {
"bool": {
"must": [
{
"bool": {
"must": [
{
"bool": {
"should": [
{
"match_phrase": {
"_all": "java"
}
}
],
"minimum_should_match": 1
}
}
]
}
}
],
"should": [
{
"nested": {
"path": "skills",
"score_mode": "avg",
"query": {
"bool": {
"must": [
{
"term": {
"skills.name.original": "java"
}
}
],
"should": [
{
"match": {
"skills.source": {
"query": "linkedin",
"boost": 1.2
}
}
},
{
"match": {
"skills.source": {
"query": "meetup",
"boost": 1.2
}
}
}
]
}
}
}
}
]
}
},
"filter": {
"and": [
{
"bool": {
"should": [
{
"term": {
"skills.name.original": "java"
}
}
]
}
}
]
}
}
}

现在的问题是我期望两个类似的文档,其中唯一的区别是技能“java”上的“source”值。它们分别是“linkedin”和“meetup”。在我的新查询中,它们都获得了相同的提升,但两个文档的最终 _score 却截然不同。

来自文档 1 的查询说明:

"value": 3.82485,
"description": "Score based on child doc range from 0 to 125"

对于文档二:

"value": 2.1993546,
"description": "Score based on child doc range from 0 to 125"

这些值是唯一不同的值,我不明白为什么。

最佳答案

我无法回答有关提升的问题,但是索引上有多少个分片?TF 和 IDF 是按分片而不是按索引计算的,这可能会造成分数差异。 https://groups.google.com/forum/#!topic/elasticsearch/FK-PYb43zcQ .

如果仅使用 1 个分片重新索引会改变结果吗?

编辑:此外,文档范围是分片中每个文档的文档范围,您可以使用它来计算每个文档的 IDF 以验证分数。

关于Elasticsearch 通过嵌套查询提高分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26263562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com