【问题标题】:Elasticsearch Get The Highest Score From Groups Of FieldsElasticsearch 从字段组中获得最高分
【发布时间】:2013-05-02 09:07:47
【问题描述】:

我正在对包含多个可能出现名称的字段的文档进行名称查询。在许多情况下,每个文档节点的名称都是相同的。但是,在某些情况下,可能会有所不同。我想在匹配度最高的字段/节点上对我的查询进行评分。

所以假设我已经索引了以下文档。

{
  "id" : 1,
  {"object1": {"name" : 'Todd Hughes'}},
  {"object2": {"name" : 'Todd Hughes'}},
  {"object3": {"name" : 'Todd Hughes'}}
}

{
  "id" : 2,
  {"object1": {"name" : 'Todd Hunt'}},
  {"object2": {"name" : 'Todd Hunt'}},
  {"object3": {"name" : 'Ken Collins'}}
}

{
  "id" : 3,
  {"object1": {"name" : 'Todd Huddle'}},
  {"object2": {"name" : 'Todd Huddle'}},
  {"object3": {"name" : 'Todd Huddle'}}
}

我希望能够搜索“Todd Hunt”并首先获得“id”为 2 的第二条记录。我的问题是这些字段是用 ngrams 和其他文档索引的,#1 和 #3 部分匹配,并且每个对象节点/字段的总和被加在一起。所以这对我不起作用。

"bool" : {
  "should" : [
    {:field : {"object1.name" : "Todd Hunt"}},
    {:field : {"object2.name" : "Todd Hunt"}},
    {:field : {"object3.name" : "Todd Hunt"}}
  ],
  "minimum_number_should_match" : 1
}

我已尝试阅读自定义评分和排名,但我的头晕目眩。关于如何构建查询以使每个对象 1、对象 2 或对象 3 的最高排名成为最终分数的任何想法?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以使用Dis Max query

    一个查询,它生成由其子查询生成的文档的联合,并且使用任何子查询生成的该文档的最高分数为每个文档打分,加上任何额外匹配的平局增量子查询

    考虑到每个 子查询 都是针对不同字段的查询,您将获得所需的行为。

    您可以选择使用决胜局来为在多个字段中匹配的文档“打高分”。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 2021-05-27
    • 1970-01-01
    • 2019-06-23
    • 2019-06-20
    • 2020-07-22
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多