我正在对包含名称可能出现的多个字段的文档进行名称查询。在许多情况下,每个文档节点的名称都相同。但是,在某些情况下,可能会有所不同。我想在最匹配的字段/节点上对我的查询进行评分。
所以假设我将以下文件编入索引。
{
"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的第二条记录。我的问题是这些字段用ngramms索引,其他文档#1和#3部分匹配,每个对象节点/字段的总和加在一起。所以这对我不起作用。
"bool" : {
"should" : [
{:field : {"object1.name" : "Todd Hunt"}},
{:field : {"object2.name" : "Todd Hunt"}},
{:field : {"object3.name" : "Todd Hunt"}}
],
"minimum_number_should_match" : 1
}
我已经尝试过阅读自定义评分和排名,而我的头脑正在旋转。关于如何构造查询以使每个object1,object2或object 3的最高排名是最终得分的任何想法?
答案 0 :(得分:3)
您可以使用Dis Max query
生成由其子查询生成的文档的并集的查询,为每个文档评分由任何子查询生成的该文档的最高分数,以及任何其他匹配的平局增量子查询
考虑到每个子查询都是对不同字段的查询,您将获得所需的行为。
您可以选择使用平局判断器为多个字段中匹配的文档“提供更多分数”。