对象上的 elasticsearch 过滤器 属性

elasticsearch filter on object property

我正在尝试过滤对象(人)属性(姓名)上的术语,但似乎没有弄清楚哪里出了问题。如果我对字段 "t" 进行过滤,它会起作用,但我似乎无法对对象进行过滤!谁能帮帮忙!

我的查询如下:

"query": {
    "filtered" : {
        "filter" : {
            "term" : { "person.fname" : "JOHN"}
        }      
    }

}

我的映射:

    {
        "_ttl": {"enabled": true, "default": '90d'},

        "properties" : {
            "t": { "type" : "date" },

            "person": {   "type" : "object",
                    "properties" : {
                      "fname" : { "type" : "string"},
                      "lname" : { "type" : "string"}
                    }
            }

        }

    }

该文档存在于索引中...

{
  "_index" : "personindex",
  "_type" : "S",
  "_id" : "AUxnFFrAGK3sw8tqMMY0",
  "_score" : 1.0,
  "_source":{"t":1427658527178,"person":{"fname":"JOHN","lname":"DOE"}}
}

问题与分析有关。由于您的映射未指定分析器,因此使用了 standard analyzer。标准分析器将标记转换为小写。所以术语 "john" 最终出现在倒排索引中,但术语 "JOHN" 却没有。当您 运行 一个 term 查询时,查询文本不会被分析,并且由于没有文档与确切的术语 "JOHN" 匹配,所以您不会得到任何结果。

这个查询会给你你想要的:

{
   "query": {
      "filtered": {
         "filter": {
            "term": {
               "person.fname": "john"
            }
         }
      }
   }
}

这个也一样(因为 match query 对查询文本执行分析):

{
    "query": {
        "match": {
           "person.fname": "JOHN"
        }
    }
}

或者,您可以在该字段上设置不同的分析器(或 none)以使您的术语过滤器正常工作。

这是我用来玩弄它的一些代码:

http://sense.qbox.io/gist/a87bcca08496218b07287d358939c1caed42f047