Elasticsearch:如何获得匹配查询中匹配的每个单词的分数

时间:2016-02-05 06:41:24

标签: java search elasticsearch lucene

所以我有一个用例,我需要查询一些特定单词的句子,我的数据集看起来像这样

{
        "_index": "12_index",
        "_type": "skill_strings",
        "_id": "AVKv-kM4axmY3fECZw9T",
        "_source": {
           "str": "SQL Server"
        }
     },
     {
        "_index": "12_index",
        "_type": "skill_strings",
        "_id": "AVKv-kNfaxmY3fECZw9U",
        "_source": {
           "str": "SQL .net java"
        }
     },
     {
        "_index": "12_index",
        "_type": "skill_strings",
        "_id": "AVKv-kPDaxmY3fECZw9X",
        "_source": {
           "str": "My SQL java php .net"
        }
     },
     {
        "_index": "12_index",
        "_type": "skill_strings",
        "_id": "AVKv-kOtaxmY3fECZw9W",
        "_source": {
           "str": "My SQL Server"
        }
     },
     {
        "_index": "12_index",
        "_type": "skill_strings",
        "_id": "AVKv-kOeaxmY3fECZw9V",
        "_source": {
           "str": "php asp.net Server"
        }
     }

我当前的查询看起来像这样

GET 12_index/skill_strings/_search
{
   "explain": true,
   "query" : { 
      "bool": {
         "should": [
            {"match_phrase" : { "str" : "SQL Server" }},
            {"match_phrase" : { "str" : ".net" }}
         ]
      }
   } 
}

因此,用例是找到具有任何一种技能的文档,我需要获得每个匹配的个人得分(我以后需要它们进行计算)。我不能使用匹配文档的总分,而是我需要每个匹配的单词/短语的分数。

使用explain:true,为我提供了得分的解释,但是我无法找到任何方法来取得这个分数并在java中使用

我的java代码看起来像这样

SearchResponse searchResponse = client.prepareSearch(index)
        .setQuery(jsonQuery)
        .setTypes(type)
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setFrom(from).setSize(size).setExplain(true)
        .execute()
        .actionGet()

for(SearchHit hit : searchResponse.getHits()){
            def id = hit.getId()
            Map resMap = hit.getSource()
            resMap.eplaination = hit.getExplanation().getDetails()
            resData.add(resMap)
        }
return resData

我可以看到当我执行hit.getExplanation()。getDetails()我得到类org.apache.lucene.search.Explanation的对象,但我不知道如何从中检索单个分数。欢迎任何帮助。感谢

1 个答案:

答案 0 :(得分:0)

hit.getExplanation().getValue()会给你分数。正如您所提到的,hit.getExplanation().getDetails()本身就是org.apache.lucene.search.Explanation数组。您可以通过调用score方法获取所有子计算的getValue()