如何在 Elasticsearch 中将值与关键字相关联
How to associate a value with a keyword in Elasticsearch
我正在使用 Elasticsearch 7.6 并使用以下映射定义为关键字列表编制索引:
"keywords" : {
"type" : "text",
"analyzer": "std_folded",
"store": true,
"fields": {
"keyword": {
"type": "keyword"
}
}
},
如您所见,该字段的名称是 keywords
,它将给出一个单词列表。此外,我将 keywords.keyword
定义为 keyword
类型。
是否可以为每个单词分配一些值(分数)?我希望稍后在我的脚本查询中检索值。
背景
因此,如果不是每个单词而是为每个字段分配一个特定值(如您的情况下的分数),您可以使用类似于 index-time boost 的内容,该内容已从 5.0 开始弃用。
据我所知,您的 keywords
字段可以有多个值,例如 foo
、bar
和 baz
属于同一文档。并且您想给出所有不同的分数,例如 foo:1
、bar:2
和 baz:3
, 那是得分或提升场上价值,而不是场上。
解决方法:使用nested data-type即可解决。
工作示例:
索引定义
{
"mappings": {
"properties": {
"keywords": {
"type": "nested" --> note this
}
}
}
}
索引示例文档
{
"keywords" : [
{
"keyword" : "foo",
"score" : 1
},
{
"keyword" : "bar",
"score" : 2
},
{
"keyword" : "baz",
"score" : 3
}
]
}
搜索查询以获取具有 foo
和得分 1
的文档
{
"query": {
"nested": {
"path": "keywords",
"query": {
"bool": {
"must": [
{
"match": {
"keywords.keyword": "foo"
}
},
{
"match": {
"keywords.score": 1
}
}
]
}
},
"inner_hits": { --> notice this, it would bring inner doc `foo:1`
}
}
}
}
搜索结果
"hits": [
{
"_index": "nested",
"_type": "_doc",
"_id": "1",
"_score": 1.9808291,
"_source": {
"keywords": [
{
"keyword": "foo",
"score": 1
},
{
"keyword": "bar",
"score": 2
},
{
"keyword": "baz",
"score": 3
}
]
},
"inner_hits": {
"keywords": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.9808291,
"hits": [
{
"_index": "nested",
"_type": "_doc",
"_id": "1",
"_nested": {
"field": "keywords",
"offset": 0
},
"_score": 1.9808291, --> your expected result in inner hits
"_source": {
"keyword": "foo",
"score": 1
}
}
]
我正在使用 Elasticsearch 7.6 并使用以下映射定义为关键字列表编制索引:
"keywords" : {
"type" : "text",
"analyzer": "std_folded",
"store": true,
"fields": {
"keyword": {
"type": "keyword"
}
}
},
如您所见,该字段的名称是 keywords
,它将给出一个单词列表。此外,我将 keywords.keyword
定义为 keyword
类型。
是否可以为每个单词分配一些值(分数)?我希望稍后在我的脚本查询中检索值。
背景
因此,如果不是每个单词而是为每个字段分配一个特定值(如您的情况下的分数),您可以使用类似于 index-time boost 的内容,该内容已从 5.0 开始弃用。
据我所知,您的 keywords
字段可以有多个值,例如 foo
、bar
和 baz
属于同一文档。并且您想给出所有不同的分数,例如 foo:1
、bar:2
和 baz:3
, 那是得分或提升场上价值,而不是场上。
解决方法:使用nested data-type即可解决。
工作示例:
索引定义
{
"mappings": {
"properties": {
"keywords": {
"type": "nested" --> note this
}
}
}
}
索引示例文档
{
"keywords" : [
{
"keyword" : "foo",
"score" : 1
},
{
"keyword" : "bar",
"score" : 2
},
{
"keyword" : "baz",
"score" : 3
}
]
}
搜索查询以获取具有 foo
和得分 1
的文档
{
"query": {
"nested": {
"path": "keywords",
"query": {
"bool": {
"must": [
{
"match": {
"keywords.keyword": "foo"
}
},
{
"match": {
"keywords.score": 1
}
}
]
}
},
"inner_hits": { --> notice this, it would bring inner doc `foo:1`
}
}
}
}
搜索结果
"hits": [
{
"_index": "nested",
"_type": "_doc",
"_id": "1",
"_score": 1.9808291,
"_source": {
"keywords": [
{
"keyword": "foo",
"score": 1
},
{
"keyword": "bar",
"score": 2
},
{
"keyword": "baz",
"score": 3
}
]
},
"inner_hits": {
"keywords": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.9808291,
"hits": [
{
"_index": "nested",
"_type": "_doc",
"_id": "1",
"_nested": {
"field": "keywords",
"offset": 0
},
"_score": 1.9808291, --> your expected result in inner hits
"_source": {
"keyword": "foo",
"score": 1
}
}
]