2013-05-01 103 views
0

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

因此,假设我有以下索引的文件。

{ 
    "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'}} 
} 

我想能够搜索“托德亨特”,并与2“ID”先拿到第二个记录。我的问题是这些字段是用ngram建立索引的,其他文档#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的最高等级是最终得分?

回答

3

可以使用Dis Max query

产生由其子查询产生的文件的联合查询,以及分数每个文档的最大得分为任何子查询产生的文件,再加上一个平局决胜增加任何额外的匹配子查询

考虑到每个子查询将是一个不同领域的查询,你会得到所需的行为。

您可以选择使用联合断路器为在多个字段中具有匹配的文档“提供更多得分”。

+0

谢谢,我昨晚找到了。这是我的查询结果如何。 https://gist.github.com/metaskills/5501600 – MetaSkills 2013-05-02 11:23:28

相关问题