Elasticsearch筛选了部分字段名称

时间:2016-01-27 23:52:46

标签: elasticsearch

是否可以仅使用字段的部分路径(而不是完全限定的路径)对弹性搜索执行过滤查询。

例如,我的映射如下所示:

{
  "library" : {
     "properties":{
        "name" : {
            "type":"string"
        },
        "address" : {
            "properties":{
                "city" : {
                    "type":"string"
                }
            }
        }
     }
  }
}

如果我对' name'进行过滤查询字段或' libary.name'字段(具有有效值)我按预期返回结果。但是,如果我在' address.city'上进行过滤查询或者' city'我没有得到任何结果;我必须将代码命名为' library.address.city'。

我无法找到解释此行为的任何文档。任何建议都可以让我的过滤查询适用于' address.city'类似于它已经适用于' name'?

这有效

{
  "query": {
        "filtered": {
            "query": {
                "term": {
                    "name" : "xyz"
                }
            }
        }
    }
}

这不起作用(或#c; address.city'相反)

 {
      "query": {
            "filtered": {
                "query": {
                    "term": {
                        "city" : "xyz"
                    }
                }
            }
        }
    }

谢谢!

1 个答案:

答案 0 :(得分:1)

这可能是由于term query,它正在寻找完全匹配。您使用的是object datatype,您应该可以使用address.city访问 city 字段。

我用你的映射

创建了索引
PUT ob_index
{
  "mappings": {
    "library": {
      "properties": {
        "name": {
          "type": "string"
        },
        "address": {
          "properties": {
            "city": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}

然后插入文件

PUT ob_index/library/11
{
  "name" : "Tesla",
  "address" : {
    "city" : "orlando"
  }
}

您可以使用address.city查询城市字段。

GET ob_index/_search
{
  "query": {
    "filtered": {
      "query": {
        "term": {
          "address.city": {
            "value": "orlando"
          }
        }
      }
    }
  }
}

这将为您提供文档,现在如果您将 orlando 替换为 Orlando 然后它将无法匹配,您可能希望使用match query,因为您的字段是analyzedMore进行分析。

您还可以使用query string query并使用wildcard作为字段

GET ob_index/_search
{
  "query": {
    "query_string": {
      "fields": ["address*"], 
      "query": "orlando"
    }
  }
}

这将搜索地址对象内的所有内容

希望这有帮助!