在 ElasticSearch 7+ 中,您如何搜索所有文本字段?
In ElasticSearch 7+ how do you search all text fields?
我想在我存储在 Elasticsearch 7.3 中的文档中搜索一个词
我希望在以前版本的 Elasticsearch 上运行的示例是:
{
"query": {
"bool": {
"must": [
{
"match": {
"_all": "oliver"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}
但此查询不适用于 Elasticsearch 7+,因为 _all
已被删除。既然 _all
字段消失了,我该如何编写查询来完成同样的事情?
注意:我已阅读使用 copy_to
将所有字段复制到自定义字段的建议,但这需要明确写出每个字段以包含在 all_fields 字段中。因为我有很多小字段,所以我试图避免这种情况,而是复制能够查询 _all 允许的行为。
它在 ES 文档中提到。
_all may no longer be enabled for indices created in 6.0+, use a custom field and the mapping copy_to parameter
因此,您需要做的是创建您自己的自定义 _all
字段,您可以将其命名为 all_fields
等,然后使用 copy_to 复制您的所有字段值拥有 all_fields
,所以现在由于此自定义字段具有所有字段值,因此您可以使用它来代替 _all
字段。
我 运行 遇到过类似的情况。据我所知,有两种方法可以在没有 _all 字段的情况下搜索世界中的所有文本字段。
最佳方法可能是使用 simple_query_string or query_string 查询。默认情况下,这些将搜索所有字符串(文本或关键字)字段。
如果出于某种原因,您需要一个包含所有文本标记的显式字段,例如 _all
字段,您可以创建自己的字段。您可以在显式映射的文本或关键字字段上使用 "copy_to": "_all"
来包含已知字段,但这只能解决一半的问题。要在此字段中包含未知字段,您还需要使用 "copy_to": "_all"
映射创建 dynamic template。动态模板专门匹配动态字段,因此如果您将其与显式映射字段上的 copy_to 组合,您应该有一个字段包含来自已知和未知字段的所有文本标记。这不是最佳的原因是因为这会对数据库的大小产生重大影响。这是一个简单的映射示例,应该可以完成您想要的:
{
"mappings": {
"dynamic_templates": [
{
"all_text": {
"match_mapping_type": "string",
"mapping": {
"copy_to": "_all",
"type": "text"
}
}
}
],
"properties": {
"_all": {
"type": "text"
},
"email": {
"type": "text",
"copy_to": [
"_all"
]
},
"name": {
"type": "keyword",
"copy_to": [
"_all"
]
}
}
}
}
我想在我存储在 Elasticsearch 7.3 中的文档中搜索一个词
我希望在以前版本的 Elasticsearch 上运行的示例是:
{
"query": {
"bool": {
"must": [
{
"match": {
"_all": "oliver"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 10,
"sort": [],
"aggs": {}
}
但此查询不适用于 Elasticsearch 7+,因为 _all
已被删除。既然 _all
字段消失了,我该如何编写查询来完成同样的事情?
注意:我已阅读使用 copy_to
将所有字段复制到自定义字段的建议,但这需要明确写出每个字段以包含在 all_fields 字段中。因为我有很多小字段,所以我试图避免这种情况,而是复制能够查询 _all 允许的行为。
它在 ES 文档中提到。
_all may no longer be enabled for indices created in 6.0+, use a custom field and the mapping copy_to parameter
因此,您需要做的是创建您自己的自定义 _all
字段,您可以将其命名为 all_fields
等,然后使用 copy_to 复制您的所有字段值拥有 all_fields
,所以现在由于此自定义字段具有所有字段值,因此您可以使用它来代替 _all
字段。
我 运行 遇到过类似的情况。据我所知,有两种方法可以在没有 _all 字段的情况下搜索世界中的所有文本字段。
最佳方法可能是使用 simple_query_string or query_string 查询。默认情况下,这些将搜索所有字符串(文本或关键字)字段。
如果出于某种原因,您需要一个包含所有文本标记的显式字段,例如 _all
字段,您可以创建自己的字段。您可以在显式映射的文本或关键字字段上使用 "copy_to": "_all"
来包含已知字段,但这只能解决一半的问题。要在此字段中包含未知字段,您还需要使用 "copy_to": "_all"
映射创建 dynamic template。动态模板专门匹配动态字段,因此如果您将其与显式映射字段上的 copy_to 组合,您应该有一个字段包含来自已知和未知字段的所有文本标记。这不是最佳的原因是因为这会对数据库的大小产生重大影响。这是一个简单的映射示例,应该可以完成您想要的:
{
"mappings": {
"dynamic_templates": [
{
"all_text": {
"match_mapping_type": "string",
"mapping": {
"copy_to": "_all",
"type": "text"
}
}
}
],
"properties": {
"_all": {
"type": "text"
},
"email": {
"type": "text",
"copy_to": [
"_all"
]
},
"name": {
"type": "keyword",
"copy_to": [
"_all"
]
}
}
}
}