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

标签 java elasticsearch elasticsearch-java-api

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

我知道 _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"
      ]
    }
  }

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

关于java - 在不知道字段是什么的情况下如何创建 ElasticSearch 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49420747/

相关文章:

scala - 如何解决此错误值toDS不是org.apache.spark.rdd.RDD的成员?

Elasticsearch POST/my-index/_count 错误 406 Not Acceptable

java - ElasticSearch 存储桶聚合

java - 使用 Rest High Level Client 检索数据或将数据插入 Elastic Search 时出现 SocketTimeoutException

java - 当前线程中不存在具有范围类型注释 @RequestScoped 的 WebBeans 上下文

java - 启动 Gradle 守护进程,2 个繁忙和 6 个停止的守护进程无法重用,使用 --status 了解详细信息

c# - 具有两个短语的多阶段方法 - Elasticsearch

elasticsearch - 正确查询ES中类似嵌套的属性(但不包含嵌套类型)

java - 在所有方法调用上允许类型见证有什么意义?

从 GUI 但不是从控制台应用程序调用 JNI 时,Java 关闭(崩溃)