Elasticsearch - 收集项目的得分

时间:2017-02-13 10:46:39

标签: elasticsearch

我有一个问题,如何获取已找到文档(嵌入文档)的收集项目的得分(_score)。

E.g。我正在寻找具有特定部分的产品。所以我想获得哪些部分最匹配的信息。

准确地说:我不想限制结果集中内部文档(产品的一部分)的数量。我只需要知道哪个部分匹配得最好。

我的映射:

"products": {
  "properties": {
    "Id": {
      "type": "string"
    },
    "Name": {
      "type": "string"
    },
    "RelationshipId": {
      "type": "string"
    },
    "Parts": {
      "properties": {
        "PartName": {
          "type": "string"
        },
        "CompanyId": {
          "type": "string"
        },
        "IsPrimary": {
          "type": "boolean"
        }
      }
    }
  }
}

我的查询结果:

{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "localhost",
            "_type": "products",
            "_id": "9AEEA518-D4F1-E611-8274-8CDCD44D0F98",
            "_score": 1,
            "_source": {
               "Id": "9AEEA518-D4F1-E611-8274-8CDCD44D0F98",
               "Name": "Test1",
               "RelationshipId": "B51AA2C8-D3F1-E611-8274-8CDCD44D0F98",
               "Parts": [
                  {
                     "PartName": "abc 1",
                     "CompanyId": "9EEEA518-D4F1-E611-8274-8CDCD44D0F98",
                     "IsPrimary": "1"
                  },
                  {
                     "PartName": "wer 2",
                     "CompanyId": "BAAF7E32-D4F1-E611-8274-8CDCD44D0F98",
                     "IsPrimary": "0"
                  }
               ]
            }
         }
      ]
   }
}

1 个答案:

答案 0 :(得分:0)

事实证明,唯一的解决方案是使用nested集合。没有它,集合中的所有文档都被压缩成一组“变量”,你无法知道命中来自哪个文档。

为每个元素使用带score的嵌套集合:

1)使用以下条目将内部集合转换为nested"type": "nested"

2)调整查询以使用nested运算符。

3)要查询(使用嵌套集合的内容),请应用"inner_hits" : {}条目。

4)对于查询结果,score将在路径hits.hits.inner_hits.COLLECTION_NAME.hits内“隐藏”。解析它并通过Id加入主结果(并非每个集合项都可能被命中)。对每个内部文档使用score值来对主结果集中的源集合进行排序。

就是这样。详细信息在文档中。