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

时间:2018-03-22 04:47:06

标签: java elasticsearch elasticsearch-java-api

我有人把JSON对象放到Elasticsearch中,我不知道任何字段。我想使用matchQuery搜索所有字段中的给定值。

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

1 个答案:

答案 0 :(得分:3)

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

所以,让我们去创建索引:

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"
      ]
    }
  }

因此,您可以创建索引的索引和映射,然后您就可以搜索发送给它的任何人。