2015-07-20 87 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" 
      } 
      }], 
相關問題