4

我是弹性搜索的新手,所以请善待。

我正在尝试存储和查询带有 N 个标签的数据。我想将搜索查询数组与存储的数组进行比较,并按与最多标签匹配的项目的顺序返回结果。

数据集示例:

{ name: "karl", tags: ["terrible", "programmer"] }
{ name: "bob", tags: ["awesome", "programmer"] }

查询示例,匹配两个人:

query: { tags: ["programmer"] }
result: [karl, bob]

在这个例子中,两者都被返回,但 bob 得分很高,因为匹配了更多标签,但Karl 仍然显示,尽管没有匹配 on awesome

query: { tags: ["programmer", "awesome"] }
result: [bob, karl]

我得到的壁橱是这个,但它似乎没有比卡尔高鲍勃得分

{
  "query": {
    "bool": {
      "should": [
        { "match": { "tags": "programmer" } },
        { "match": { "tags": "awesome" } }
       ],
      "minimum_number_should_match": 1
    }
  }
}

希望得到一些支持:-)谢谢!

4

2 回答 2

2

它的得分bob明显高于karl在此处输入图像描述

如果要匹配两个标签,请增加minimum运算符: 在此处输入图像描述

这与一堆bool-musts 基本相同:

GET karl/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "tags": "programmer"
          }
        },
        {
          "match": {
            "tags": "awesome"
          }
        }
      ]
    }
  }
}
于 2020-03-31T19:23:35.850 回答
0

如果您只需要匹配两个(甚至更多)标签的文档,则需要使用必须查询(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl- bool-query.html ) 您的查询如下所示:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "tags": "programmer" } },
        { "match": { "tags": "awesome" } }
       ]
    }
  }
}
于 2020-04-03T14:18:06.850 回答