如何在elasticsearch中搜索标签

时间:2017-03-30 09:22:40

标签: elasticsearch full-text-search elasticsearch-5

我正在创建搜索照片库项目,其中照片最多可以有50个标签(就像在shutterstock和fotolia中一样)。我在elasticsearch中创建我的搜索。我在elasticsearch中有一个带有datatype关键字的字段。当查询出现"抽象背景"时,我想在图像的所有关键字中搜索抽象和背景,并根据它们的相关性对它们进行排序。它不应该匹配abstr backgrou。我写了一个这样的查询

 "query": {
    "bool": {
      "should": [
        {
          "match": {
            "keyword": {
              "query": "abstract, background"
            }
          }
        }
      ]
    }
  }

它仅适用于匹配单个关键字。我想匹配多个关键字,并根据它们的相关性对它们进行排序。感谢

----- ------ EDIT

这些是我的映射。 标题字段工作正常。类别仅用于聚合,关键字是要匹配的主要字段。

PUT /freevects
{
  "mappings": {
    "photos": {
      "properties": {
        "title": {
          "type": "text",
          "boost": 1.9,
          "analyzer": "standard"
        },
        "keyword": {
          "type": "keyword",
          "boost": 1.4
        },
        "category": {
          "type": "keyword",
          "index": false
        },
        "quality": {
          "type": "short",
          "index": false,
          "boost": 1.1
        },
        "downloads": {
          "type": "integer",
          "index": false,
          "boost": 1.1
        },
        "likes": {
          "type": "integer",
          "index": false,
          "boost": 1
        },
        "filename": {
          "type": "keyword",
          "index": false
        },
        "type": {
          "type": "keyword",
          "index": false
        },
        "free": {
          "type": "short",
          "index": false
        },
        "created": {
          "type": "date",
          "index": false
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:4)

问题是keyword字段的映射。它的映射中为type: keyword。 这不会对您的搜索查询和索引值进行标记。因此,当您搜索时,将按原样搜索这些术语。 示例:搜索:"摘要,背景"正如你在问题中所做的那样,实际上只会搜索"抽象,背景和#34;在关键字字段中。 将关键字字段的映射更改为:

"keyword": {
  "type": "text",
  "boost": 1.4
}

将您的值索引为:

{
  "keyword": ["abstract", "background"]
}

将是我的建议。

参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-analyzer.html

查询标签:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "keyword": "abstract"
          }
        },
        {
          "match": {
            "keyword": "background"
          }
        }
      ]
    }
  }
}

编辑:将字符串类型更改为文本,因为它在较新版本的弹性版中已弃用,如OP指出的那样。