Elasticsearch查询查看对象并比较某些元素

时间:2018-03-21 18:45:38

标签: elasticsearch

我刚开始使用Elasticsearch。我有这样的文件:

{
  arr: {
    "01": "one phrase",
    "02": "another",
    "03": 900
  },
  field1: "val1",
  field2: "val2"
}

查找arr字段中第二个元素以“ano”开头的所有文档以及第三个字段在800 - 1000范围内的所有文档应该是什么?

如果效率太低,我现在可以自由地将这种“架构”改为不同的东西。

我已经阅读了有关嵌套对象的内容,但在此阶段无法理解我是否必须显式命令Elasticsearch为arr字段内部建立索引。如果我有,我会很感激创建索引命令的示例,其中包含某种“如果存在”,因为应用程序将在每次启动时尝试创建此索引。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以通过访问此网址

来检索映射
http://localhost:9200/YOUR_INDEX_NAME_HERE/_mapping

如果在插入条目之前未指定映射,则elasticsearch会通过为您创建它来处理它。点击这里查看更多 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html

我希望它是这样的

{
  "my_index": {
    "mappings": {
      "doc": {
        "properties": {
          "arr": {
            "properties": {
              "01": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "02": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "03": {
                "type": "long"
              }
            }
          },
          "field1": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "field2": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

如果我对映射的假设是正确的,那么这是查询

{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "arr.02": {
              "value": "ano*"
            }
          }
        },
        {
          "range": {
            "arr.03": {
              "gte": 800,
              "lte": 1000
            }
          }
        }
      ]
    }
  }
}

请注意,范围查询具有包容性,即800<=x<=1000。如果您想要它是独占的,意味着800<x<1000,则将查询分​​别更改为gtlt