当前位置: 首页 > 面试题库 >

Elasticsearch:使用文档中的自定义分数字段进行影响力评分

鲁钱明
2023-03-14
问题内容

我有一组通过NLP算法从文本中提取的单词,以及每个文档中每个单词的相关分数。

例如 :

document 1: {  "vocab": [ {"wtag":"James Bond", "rscore": 2.14 }, 
                          {"wtag":"world", "rscore": 0.86 }, 
                          ...., 
                          {"wtag":"somemore", "rscore": 3.15 }
                        ] 
            }

document 2: {  "vocab": [ {"wtag":"hiii", "rscore": 1.34 }, 
                          {"wtag":"world", "rscore": 0.94 },
                          ...., 
                          {"wtag":"somemore", "rscore": 3.23 } 
                        ] 
            }

我希望每个文档中rscore的match
wtag都可以影响_scoreES给它的给定值,或者乘以或加到上_score,以影响_score结果文档的最终(依次,顺序)。有什么办法可以做到这一点?


问题答案:

解决此问题的另一种方法是使用嵌套文档:

首先设置映射以创建vocab一个嵌套文档,这意味着每个wtag/ rscore文档将在内部作为单独的文档建立索引:

curl -XPUT "http://localhost:9200/myindex/" -d'
{
  "settings": {"number_of_shards": 1}, 
  "mappings": {
    "mytype": {
      "properties": {
        "vocab": {
          "type": "nested",
          "fields": {
            "wtag": {
              "type": "string"
            },
            "rscore": {
              "type": "float"
            }
          }
        }
      }
    }
  }
}'

然后索引您的文档:

curl -XPUT "http://localhost:9200/myindex/mytype/1" -d'
{
  "vocab": [
    {
      "wtag": "James Bond",
      "rscore": 2.14
    },
    {
      "wtag": "world",
      "rscore": 0.86
    },
    {
      "wtag": "somemore",
      "rscore": 3.15
    }
  ]
}'

curl -XPUT "http://localhost:9200/myindex/mytype/2" -d'
{
  "vocab": [
    {
      "wtag": "hiii",
      "rscore": 1.34
    },
    {
      "wtag": "world",
      "rscore": 0.94
    },
    {
      "wtag": "somemore",
      "rscore": 3.23
    }
  ]
}'

并运行nested查询以匹配所有嵌套文档,并rscore为每个与之匹配的嵌套文档求和:

curl -XGET "http://localhost:9200/myindex/mytype/_search" -d'
{
  "query": {
    "nested": {
      "path": "vocab",
      "score_mode": "sum",
      "query": {
        "function_score": {
          "query": {
            "match": {
              "vocab.wtag": "james bond world"
            }
          },
          "script_score": {
            "script": "doc[\"rscore\"].value"
          }
        }
      }
    }
  }
}'


 类似资料:
  • 有这些文件的: 和 我想要获得_score根据每个标记的置信度值计算出来的值。例如,如果您搜索“mountain”,它应该只返回id为1的doc,显然,如果您搜索“landsacture”,得分2应该高于1,因为landsacture在2中的置信度高于1(48.36 vs 33.66)。如果您搜索“海岸景观”,这个时间得分1应该高于2,因为doc1在tags数组中同时包含海岸和景观。我还想用“bo

  • 问题内容: 拥有这些文件: 和 我想获得基于每个标签的置信度值计算的_score。例如,如果您搜索“ mountain”,则显然应该仅返回ID为1的文档;如果您搜索“ landscape”,则得分2应该高于1,因为景观对2的置信度高于1(48.36 vs 33.66)。如果您搜索“ coast landscape”,则此时间得分1应该高于2,因为doc 1在标签数组中同时包含了Coast和Land

  • 我有以下 3 份文件。每个代表一个用户的联系人: 我需要通过数组元素对它们进行聚合/分组,这样我就可以识别重复的联系人(基于电子邮件id)。因为在文档(1 我尝试在java中使用$unwind和$group执行此操作,如下所示: 这按电子邮件ID对文档进行分组(这是正确的),但没有达到目的。 任何帮助都将不胜感激。 我需要实现的功能,用户可以在他的存储库可能重复的联系人提示。我需要聚合结果类似于:

  • 我正在向elasticsearch发送查询,它会响应其文档中字段的未知顺序。我如何修复elsasticsearch返回文档中字段的顺序?我的意思是,我正在发送这个查询: 当它回应时,它给了我一些不正常的东西。我最后想将其转换为csv,并修复csv标题。有什么方法可以让我得到像doc1:{“field1”,“field2”,“field3”,“field14”}doc2:{“field1”,“fie

  • 有没有办法使用“ACF分类法字段”来影响“自定义分类法”的帖子计数?现在我正在使用ACF分类法字段,但我的自定义分类法分配了0篇文章。 这可能吗?我尝试这样做是因为它对最终用户更友好,ACF更灵活;如果我需要用户只选择一个分类法并进行其他限制,我可以对其进行限制。

  • 我无法在任何地方找到如何在ES自定义评分函数中测试空值的示例。根据文档,脚本是时髦的,根据日志,脚本是无痛的评估,但即使这样,我仍然对一些错误感到困惑 这似乎表明我正在尝试将双精度值cas到布尔值并提出,但我需要测试非空值。 我的评分脚本应该怎么写? 编辑:我知道在无痛中我不能使用三进制的<代码>?:运算符,所以我必须显式地编写< code>doc['xx']。值!= null。然而,对于用空值索