如何在不知道字段是什么的情况下创建 ElasticSearch 查询?

How do I create an ElasticSearch query without knowing what the field is?

我有人将 JSON 个对象放入 Elasticsearch,我不知道其中的任何字段。我想使用 matchQuery 搜索 all 给定值的字段。

我知道 _all 已被弃用,并且 copy_to 不起作用,因为我事先不知道哪些字段可用。有没有办法在事先不知道要搜索哪些字段的情况下完成此操作?

是的,您可以使用自定义 _all 字段(我称之为 my_all)和索引的动态模板来实现此目的。基本上,这个想法是为具有 copy_to 设置的所有字段提供一个通用映射到 my_all 字段。我还为 my_all 字段添加了 store: true,但只是为了向您展示它有效,实际上您不需要它。

让我们开始创建索引:

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "all_fields": {
            "match": "*",
            "mapping": {
              "copy_to": "my_all"
            }
          }
        }
      ],
      "properties": {
        "my_all": {
          "type": "text",
          "store": true
        }
      }
    }
  }
}

然后索引文档:

PUT my_index/_doc/1
{
  "test": "the cat drinks milk",
  "age": 10,
  "alive": true,
  "date": "2018-03-21T10:00:00.123Z",
  "val": ["data", "data2", "data3"]
}

最后,我们可以使用 my_all 字段进行搜索,除了文档的 _source 之外,还可以显示其内容(因为我们存储了它的内容):

GET my_index/_search?q=my_all:cat&_source=true&stored_fields=my_all

结果如下图:

  {
    "_index": "my_index",
    "_type": "_doc",
    "_id": "1",
    "_score": 0.2876821,
    "_source": {
      "test": "the cat drinks milk",
      "age": 10,
      "alive": true,
      "date": "2018-03-21T10:00:00.123Z",
      "val": [
        "data",
        "data2",
        "data3"
      ]
    },
    "fields": {
      "my_all": [
        "the cat drinks milk",
        "10",
        "true",
        "2018-03-21T10:00:00.123Z",
        "data",
        "data2",
        "data3"
      ]
    }
  }

因此,只要您可以创建索引和索引的映射,您就可以搜索人们发送给它的任何内容。