2015-07-20 102 views
0

需要关于Elasticsearch的帮助。我尝试获取第一个完全匹配结果,然后使用以下查询匹配一个字段的文档,但没有运气。基本上,试图首先获得最高分,然后不太准确,并且只匹配总搜索结果中的一个字段。如何获得弹性搜索以返回结果中的完全匹配和其他匹配

的映射如下:

{ 
    "palsx1493": { 
    "mappings": { 
    "pals": { 
     "properties": { 
      "aboutme": { 
       "type": "string" 
      }, 
      "dob": { 
       "type": "date", 
       "format": "date" 
      }, 
      "fccode": { 
       "type": "string" 
      }, 
      "fcname": { 
       "type": "string" 
      }, 
      "learning": { 
       "type": "nested", 
       "properties": { 
       "skillslevel": { 
        "type": "string" 
       }, 
       "skillsname": { 
        "type": "string" 
       } 
       } 
      }, 
      "name": { 
       "type": "string" 
      }, 
      "rating": { 
       "type": "string" 
      }, 
      "teaching": { 
       "type": "nested", 
       "properties": { 
       "skillslevel": { 
        "type": "string" 
       }, 
       "skillsname": { 
        "type": "string" 
       } 
       } 
      }, 
      "trate": { 
       "type": "string" 
      }, 
      "treg": { 
       "type": "string" 
      } 
     } 
    } 
    } 

} }

搜索时,我需要的结果返回精确匹配的文档,然后在优先次序与教学skillname匹配分数较低。现在发生的事情是,我首先得到正确的匹配,然后我得到了匹配的learning.skillname,然后teach.skillname匹配。我希望这两个最后一个交换了具有完全匹配结果后的teaching.skillname。

完全匹配: 1. fcname(克罗姆是国名,可以是一个特定的名称,或只是设置为“任何国家” 2.出生日期:出生日期是一个范围值 - 一个范围值给出作为输入 3.教学:skillname 4.学习:skillname

这是我已经没有运气尝试:

{ 
"query": { 
"bool": { 
    "should": [ 
    { "match": { "fcname": "spain"}}, 
    { "range": { 
       "bod": { 
        "from": "1950-10-10", 
        "to": "1967-12-12" 
       } 
    } 
    }, 
    { 
     "nested": { 
     "path": "learning", 
     "score_mode": "max", 
     "query": { 
      "bool": { 
      "must": [ 
       { "match": { "learning.skillname": learningSkillName}} 
      ] 
      } 
     } 
     } 
    }, 
    { 
    "nested": { 
     "path": "teaching", 
     "query": { 
      "bool": { 
      "must": [ 
       { "match": { "teaching.skillname": teachingSkillName}} 
      ] 
      } 
     } 
     } 
    } 
    ] 
} 
} 
} 

回答

0

我计算出来。解决方案是使用function_score功能来为具有特定匹配字段的文档覆盖/添加分数。用以下替换上面的嵌套部分给了我正确的结果:

"nested": { 
     "path": "teaching", 
     "query": { 
      "function_score": { 
       "query": { 
       "bool": { 
        "must": [ 
         { "match": { "teaching.skillname": "xxx"}} 
        ] 
       } 
       }, 
       "functions": [ 
       { 
       "script_score": { 
       "script": "_score + 2" 
      } 
      }],