Elasticsearch(v 5.2)标记带有排名实现

时间:2018-03-11 14:21:07

标签: elasticsearch

我有一个计算文档标签并将其编入Elasticsearch的系统,以后服务器会根据这些标签搜索这些文档。现在我的问题是我想为每个标签添加我自己的排名/权重,然后根据我设置的排名/权重搜索并获得这些文档的分数。

假设我有一些类似下面文档的文档,我如何搜索并考虑每个特定标记值的my_rank字段(在此示例中为user.first = Jhon)?

示例文件:

[
  {
    "_index": "ehud_test_nested",
    "_type": "my_type",
    "_id": "2",
    "_score": 1,
    "_source": {
      "group": "tags",
      "user": [
        {
          "first": "John",
          "my_rank": 100
        },
        {
          "first": "Alice",
          "my_rank": 1
        },
        {
          "first": "bob",
          "my_rank": 3
        }
      ]
    }
  },
  {
    "_index": "ehud_test_nested",
    "_type": "my_type",
    "_id": "1",
    "_score": 1,
    "_source": {
      "group": "tags",
      "user": [
        {
          "first": "John",
          "my_rank": 1
        },
        {
          "first": "Alice",
          "my_rank": 10
        },
        {
          "first": "bob",
          "my_rank": 30
        }
      ]
    }
  }
]

1 个答案:

答案 0 :(得分:0)

找到它。

  1. 用户对象必须是嵌套类型。
  2. 使用Field value factor设置得分内的排名。
  3. 示例查询:

     {
      "query": {
        "nested": {
          "path": "user",
          "query": {
            "function_score": {
              "query": {
                "bool": {
                  "should": [
                    {
                      "match": {
                        "user.first": "John"
                      }
                    },
                    {
                      "match": {
                        "high.tag": "Alice"
                      }
                    }
                  ]
                }
              },
              "boost": "1",
              "functions": [
                {
                  "field_value_factor": {
                    "field": "user.my_rank",
                    "factor": 1,
                    "modifier": "none",
                    "missing": 1
                  }
                }
              ]
            }
          }
        }
      }
    }