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