【问题标题】:Elasticsearch filtered query for partial field nameElasticsearch 过滤查询部分字段名称
【发布时间】:2016-01-28 10:18:18
【问题描述】:

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

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

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

这不起作用(或改为“address.city”)

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

谢谢!

【问题讨论】:

  • 解决方案有效吗?

标签: elasticsearch


【解决方案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,因为您的字段是 @ 987654330@。 More 正在分析中。

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

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

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 2014-02-17
    相关资源
    最近更新 更多