如何在elasticsearch中搜索标签
how to search for tags in elasticsearch
我正在创建照片库项目搜索,其中照片最多可以有 50 个标签(就像在 shutterstock 和 fotolia 中一样)。我正在 elasticsearch 中创建我的搜索。我在 elasticsearch 中有一个带有数据类型关键字的字段。当查询出现 "Abstract Background" 时,我想在图像的所有关键字中搜索摘要和背景,并根据它们的相关性对它们进行排序。它不应该匹配 abstr backgrou。我写了一个这样的查询
"query": {
"bool": {
"should": [
{
"match": {
"keyword": {
"query": "abstract, background"
}
}
}
]
}
}
它只适用于匹配单个关键字。我想匹配多个关键字,并根据它们的相关性对它们进行排序。谢谢
-----编辑-----
这些是我的映射。
标题字段工作正常。类别仅用于聚合,关键字是匹配的主要字段。
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
}
}
}
}
}
问题出在 keyword
字段的映射上。它在您的映射中属于 type: keyword
。
这不会标记您的搜索查询和索引值。因此,当您搜索时,会按原样搜索这些字词。
示例:
搜索:“abstract, background”(正如您在问题中所做的那样),实际上只会搜索关键字字段中精确出现的“abstract, background”。
将关键字字段的映射更改为type: text
"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"
}
}
]
}
}
}
我正在创建照片库项目搜索,其中照片最多可以有 50 个标签(就像在 shutterstock 和 fotolia 中一样)。我正在 elasticsearch 中创建我的搜索。我在 elasticsearch 中有一个带有数据类型关键字的字段。当查询出现 "Abstract Background" 时,我想在图像的所有关键字中搜索摘要和背景,并根据它们的相关性对它们进行排序。它不应该匹配 abstr backgrou。我写了一个这样的查询
"query": {
"bool": {
"should": [
{
"match": {
"keyword": {
"query": "abstract, background"
}
}
}
]
}
}
它只适用于匹配单个关键字。我想匹配多个关键字,并根据它们的相关性对它们进行排序。谢谢
-----编辑-----
这些是我的映射。 标题字段工作正常。类别仅用于聚合,关键字是匹配的主要字段。
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
}
}
}
}
}
问题出在 keyword
字段的映射上。它在您的映射中属于 type: keyword
。
这不会标记您的搜索查询和索引值。因此,当您搜索时,会按原样搜索这些字词。
示例:
搜索:“abstract, background”(正如您在问题中所做的那样),实际上只会搜索关键字字段中精确出现的“abstract, background”。
将关键字字段的映射更改为type: text
"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"
}
}
]
}
}
}