2017-08-10 13 views
0

我有以下Elasticsearch内容,基本实现了用户与嵌套的技能需要从我的索引Elasticsearch:如何最大数量进行排序应与

{ 
    worker:{ 
    dynamic:"false", 
    properties: { 
    skills: { 
     type:"nested", 
     properties:{ 
      name:{ 
       type:"text" 
      }, 
      id:{ 
       type:"text" 
      } 
      } 
     } 
     } 
    } 
} 

和我进行简单的数据

Elasticsearch映射列表用户:

{ 
    "first_name": "Samir", 
    "last_name": "Yundt", 
    "skills":[ 
    { 
     "id": 1, 
     "name": "HTML" 
    }, 
    { 
     "id": 1, 
     "name": "Javascript" 
    } 
    ] 
}, 
{ 
    "first_name": "Kaley", 
    "last_name": "Fadel", 
    "skills":[ 
    { 
     "id": 1, 
     "name": "HTML" 
    }, 
    { 
     "id": 1, 
     "name": "CSS" 
    } 
    ] 
} 

我的ES查询:

{ 
    query:{ 
     bool:{ 
     should:[ 
      { 
       nested:{ 
        path:"sub_processes", 
        query:{ 
        bool:{ 
         should:[ 
          { 
           match:{ 
           "skills.name": "HTML" 
           } 
          }, 
          { 
           match:{ 
           "skills.name": "CSS" 
           } 
          } 
         } 
        ] 
        } 
       } 
      } 
     } 
     ] 
    } 
    } 
} 

那么我怎样才能通过最大数量技能匹配来排序用户呢?我发现一些文档建议使用boost,但这不是不可能的,因为我的输入(技能名称)是动态的。 谢谢全部

+0

你想根据匹配的技能数量进行排序?你尝试使用聚合吗? – zauzaj

+0

感谢您的回复,我还没有尝试过。我怎样才能做到这一点?你能解释一下吗? –

回答

0

您可以使用constant_score给每个技能一个固定的分数。 下面是一个例子:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "constant_score": { 
      "boost": 1, 
      "query": { 
       "match": { 
       "skills.name": "HTML" 
       } 
      } 
      } 
     }, 
     { 
      "constant_score": { 
      "boost": 1, 
      "query": { 
       "match": { 
       "skills.name": "CSS" 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

这样,您将获得每技能ñ得分点。 你的结果自然会按技能计数排序。

由于queryNorm,对于超过2个标签,N将不同于1(但是2个匹配总是比1强,3比2等强,等等......没有关系)。如果你想要每个领域的确切分数,你可以看看keyword datatype

相关问题