在 ElasticSearch 7+ 中,如何搜索所有文本字段?

Joh*_*ohn 6 full-text-search elasticsearch

我想在 Elasticsearch 7.3 中存储的文档中搜索单词

我希望在以前版本的 Elasticsearch 上运行的一个示例是:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "_all": "oliver"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 10,
  "sort": [],
  "aggs": {}
}
Run Code Online (Sandbox Code Playgroud)

但此查询在 Elasticsearch 7+ 上不起作用,因为_all已被删除。既然该_all字段消失了,我该如何编写查询来完成同样的事情呢?

注意:我已阅读用于将所有字段复制到自定义字段的建议copy_to,但这需要显式写出每个字段以包含在 all_fields 字段中。由于我有很多小字段,我试图避免这种情况,而是复制能够查询 _all 允许的行为。

Ian*_*ett 6

我也遇到过类似的情况。据我所知,有两种方法可以在没有 _all 字段的情况下搜索世界中的所有文本字段。

最优化的方法可能是使用simple_query_stringquery_string查询。默认情况下,这些将搜索所有字符串(文本或关键字)字段。

如果由于某种原因,您需要一个包含所有文本标记(如该_all字段)的显式字段,您可以创建自己的字段。您可以使用"copy_to": "_all"显式映射的文本或关键字字段来包含已知字段,但这只能解决一半的问题。要在此字段中包含未知字段,您还需要使用映射创建动态模板"copy_to": "_all"。动态模板专门匹配动态字段,因此如果将其与显式映射字段上的 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"
          ]
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)


Ami*_*wal 4

ES文档中提到过。

对于 6.0+ 中创建的索引,可能不再启用 _all,请使用自定义字段和映射 copy_to 参数

因此,您需要做的是创建自己的自定义_all字段,您可以将其命名为all_fieldsetc ,然后使用copy_to复制您自己的所有字段值all_fields,所以现在由于此自定义字段具有所有字段值,因此您可以使用它而不是_all字段。