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

如何提高Elasticsearch函数得分的字段长度范数?

方斌
2023-03-14
问题内容

我知道,弹性查询在计算查询检索的文档分数时会考虑字段的长度。字段越短,权重越高(请参见字段长度范数)。

我喜欢这种行为:当我搜索iphone我在更感兴趣iphone 6Crappy accessories for: iphone 5 iphone 5s iphone 6

现在,我想尝试增强这些功能,比方说,我想使其重要性加倍。

我知道可以使用功能分数来修改分数,并且我想我可以通过脚本分数来实现我想要的。

我试图像这样向得分添加另一个字段长度范数:

    {
     "query": {
       "function_score": {
         "boost_mode": "replace",
         "query": {...},
         "script_score": {
             "script": "_score + norm(doc)"
         }
       }
     }
   }

但是我失败很严重,得到了这个错误: [No parser for element [function_score]]

编辑:

我的第一个错误是我没有将功能分数包装在“查询”中。现在,我编辑了上面的代码。我的新错误说

GroovyScriptExecutionException[MissingMethodException
[No signature of method: Script5.norm() is applicable for argument types:
(org.elasticsearch.search.lookup.DocLookup) values: 
[<org.elasticsearch.search.lookup.DocLookup@2c935f6f>]
Possible solutions: notify(), wait(), run(), run(), dump(), any()]]

编辑:我提供了第一个答案,但我希望有一个更好的答案


问题答案:

它看起来像你可以做到这一点使用的字段类型token_count连同field_value_factor功能评分。

因此,在字段映射中类似以下内容:

"name": { 
  "type": "string",
  "fields": {
    "length": { 
      "type":     "token_count",
      "analyzer": "standard"
    }
  }
}

这将使用该字段中的令牌数。如果要使用字符数,可以将分析器从standard自定义符号化为将每个字符标记化。

然后在查询中:

"function_score": {
  ...,
  "field_value_factor": {
    "field": "name.length",
    "modifier": "reciprocal"
  }
}


 类似资料:
  • 我试图通过根据场值提升_score来摆脱弹性搜索中的排序。这是我的场景: 我的文档中有一个字段:应用日期。这是自EPOC以来经过的时间。我希望具有更大应用日期(最近)的记录具有更高的分数。 如果两个文档的分数相同,我想在另一个字符串类型的字段上对它们进行排序。说“状态”是另一个可以有值的字段(可用、进行中、关闭)。所以,具有相同应用程序日期的文档应该根据状态_score。可用应该有更多的分数,进行

  • 我创建了一个非常简单的测试索引,由以下5个条目组成: 然后我执行以下查询: 期望在结果中获得以下顺序: 1)“音乐节” 2)《音乐节舞曲》 然而,我得到了以下结果: 它的顺序似乎完全随机,除了最低分只匹配一个词。 是什么导致了这种情况,我可以改变什么(在映射、索引或搜索过程中)来获得预期的顺序? 注意:对于非完美匹配查询也是如此。搜索“音乐舞蹈”仍然应该产生3个单词条目作为第一个结果,所以使用或增

  • 问题内容: 我想在elasticsearch中执行搜索,而忽略tf- idf搜索中的字段范数。您可以通过设置索引映射来忽略字段规范来完成此操作。但是,这似乎是通过更改索引来完成的,我只想修改搜索(我需要其他类型搜索的规范)。做到这一点的最佳方法是什么?我正在使用elasticsearch.js作为Elasticsearch的接口。 问题答案: 您不能基于每个搜索禁用规范,但是可以使用Multi F

  • 我已经把这个贴在ES组上了,但是我没有得到回应,所以我把它贴在了so上。链接https://discuse . elastic . co/t/missing-field-value-for-nested-field-function-score-query-V7-10-2/291365 我已经尝试了很长时间,但嵌套字段值在计算分数时总是表示缺少字段值。 映射: 为了简单起见,我只保留了一个记录。记

  • 1背景 在本文中,我们将描述如何将地图点与光栅相关联。我的问题是,如果函数st_worldtorastercoordx(rast,geom)在光栅对象中有超过10000*10000个像素,我们如何提高速度。此问题与中间件PostGIS光栅对象相关。 2 创建路测数据点对象 2.1 创建点对象字段 在前面的对象中,我们使用水壶中间件将驱动测试数据文件上传到Postgres-SQL数据库中。在数据库中

  • 问题内容: 我试图获取记录在“标题”中,然后是X个字符。 注意:并非所有记录都包含标题字段。 我努力了: 结果,我得到这个错误: 我该如何解决? 问题答案: 您需要考虑到某些文档可能具有空字段。因此,您可以使用常规的空安全运算符。另外,请确保改用POST方法: