elasticsearch过滤对象属性

时间:2015-03-29 19:57:10

标签: elasticsearch lucene

我试图在对象(人)属性(名称)上过滤一个术语,但似乎没有得到什么问题。如果我在字段“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"}}
}

1 个答案:

答案 0 :(得分:2)

问题与分析有关。由于您的映射未指定分析器,因此使用standard analyzer。标准分析器将令牌转换为小写。因此,术语“约翰”最终出现在倒排索引中,但术语“约翰”却没有。当您运行term查询时,不会分析查询文本,因为没有文档与确切的术语“JOHN”匹配,所以没有结果。

此查询将为您提供所需内容:

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

与此一样(因为match query对查询文本执行分析):

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

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

以下是我用来玩它的一些代码:

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