是否可以仅使用字段的部分路径(而不是完全限定的路径)对弹性搜索执行过滤查询。
例如,我的映射如下所示:
{
"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"
}
}
}
}
}
谢谢!
答案 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,因为您的字段是analyzed
。 More进行分析。
您还可以使用query string query
并使用wildcard
作为字段
GET ob_index/_search
{
"query": {
"query_string": {
"fields": ["address*"],
"query": "orlando"
}
}
}
这将搜索地址对象内的所有内容
希望这有帮助!