Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 按嵌套字段排序_Database_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Database,elasticsearch" /> elasticsearch,Database,elasticsearch" />

Database 按嵌套字段排序

Database 按嵌套字段排序,database,elasticsearch,Database,elasticsearch,我在elastic有一个这样的文档类型 { "name": "Foo Bar", "myTags": [ { "id": 3, "name": "My tag 1" }, { "id": 5, "name": "My Tag 5" }, { "id": 7, "name": "My Tag 7" } ] } 现在,给定3个标记,我想按照匹配标记的数量对所有文档进行

我在elastic有一个这样的文档类型

{
  "name": "Foo Bar",
  "myTags": [
    {
      "id": 3,
      "name": "My tag 1"
    },
    {
      "id": 5,
      "name": "My Tag 5"
    },
    {
      "id": 7,
      "name": "My Tag 7"
    }
  ]
}
现在,给定3个标记,我想按照匹配标记的数量对所有文档进行排序。因此,首先是匹配所有3个标记的文档,而不是匹配2个标记的文档,然后是一个,最后是无标记的文档


我该怎么做

您可以使用
功能\u评分来完成:

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      }, 
      "functions": [
        {
          "filter": {
            "nested": {
              "path": "myTags",
              "query": {
                "term": {
                  "myTags.name": "My Tag 1"
                }
              }
            }
          },
          "weight": 1
        },
        {
          "filter": {
            "nested": {
              "path": "myTags",
              "query": {
                "term": {
                  "myTags.name": "My Tag 5"
                }
              }
            }
          },
          "weight": 1
        },
        {
          "filter": {
            "nested": {
              "path": "myTags",
              "query": {
                "term": {
                  "myTags.name": "My Tag 7"
                }
              }
            }
          },
          "weight": 1
        }
      ],
      "boost_mode": "sum", 
      "score_mode": "sum"
    }
  }
}

您可以使用
功能\u分数来执行此操作

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      }, 
      "functions": [
        {
          "filter": {
            "nested": {
              "path": "myTags",
              "query": {
                "term": {
                  "myTags.name": "My Tag 1"
                }
              }
            }
          },
          "weight": 1
        },
        {
          "filter": {
            "nested": {
              "path": "myTags",
              "query": {
                "term": {
                  "myTags.name": "My Tag 5"
                }
              }
            }
          },
          "weight": 1
        },
        {
          "filter": {
            "nested": {
              "path": "myTags",
              "query": {
                "term": {
                  "myTags.name": "My Tag 7"
                }
              }
            }
          },
          "weight": 1
        }
      ],
      "boost_mode": "sum", 
      "score_mode": "sum"
    }
  }
}

您为此使用评分,并使用带有三(3)个标记的
bool
语句
should
语句,如果一个标记“匹配”(无论在您的用例中意味着什么),这些语句将增加评分。我们的想法是,如果一个标签匹配,它将增加分数。您为此使用计分,并使用带有三(3)个标签的
bool
should
语句,如果一个标签“匹配”(无论在您的用例中意味着什么),它将增加分数。这个想法是,如果一个标签匹配,它将增加分数。我忘了提到我的弹性1.7.5。这个查询可以吗?它应该适用于1.7。其思想是,如果文档与其中一个标记匹配,则得分为+1。如果它匹配另一个标记,那么另一个+1,依此类推。基本上,最终的分数将是匹配标签的计数+1(从默认的
match_all
默认查询)。我必须将
weight:1
更改为
weight:2
,否则,当只使用一个标签进行过滤时,我会得到奇怪/错误的结果。我忘了提到我使用的是Elastic 1.7.5。这个查询可以吗?它应该适用于1.7。其思想是,如果文档与其中一个标记匹配,则得分为+1。如果它匹配另一个标记,那么另一个+1,依此类推。基本上,最终得分将是匹配标记的计数+1(从默认的
match\u all
默认查询)。我必须将
weight:1
更改为
weight:2
,否则,当只使用一个标记进行筛选时,我会得到奇怪/错误的结果。