2014-11-01 111 views
2

我是elasticseach的新手,我有一些问题需要在我的查询中添加过滤器。在grails中用弹性搜索查询嵌套字段

我的领域类是这样的:

Class A { 
    String name 
    A_Status status 

    static searchable = { 
     status component: true 
    } 
} 

Class AImpl extends A { 

} 

Class A_Status { 
    String name 
    static searchable = { 
     root : false 
     only = 'name' 
    } 
} 

在我控制我做的查询是:

def res = elasticSearchService.search() 
{ 
    bool { 
     must { 
      term("status.name": "ACTIVE") 
     } 
    } 
} 

我试图改变searchableAImpl或将"searchable = true",但有相同的结果,查询总是空的,它应该得到4个结果。

我发现的另一个奇怪的事情是,做uri搜索给了我预期的结果,但是身体查询却没有。

curl -XGET 'http://localhost:9200/com.sisconline.entities/_search?q=status.name=ACTIVE' 

这有4个匹配。

curl -XPOST 'http://localhost:9200/com.sisconline.entities/_search' -d '{ 
"query" : { 
     "term":{ "status.name":"ACTIVE"} 
     } 
}' 

这会得到0个命中。我使用Grails 2.3.4elasticsearch plugin 0.0.3.5

问候。

回答

2

我终于做来解决问题:

must { 
    nested { 
    path = "status" 
    query { 
     bool { 
      must { 
       term("status.name": "active") } 
      } 
     } 
    } 
} 

希望它可以帮助别人。

+0

您是否尝试使用您的域进行搜索? 我有类似的映射(甚至几乎相同),并面临的问题,当我尝试搜索AImpl,fe 'AImpl.search(“$ {query}”)'有一个例外在tomcat 'ERROR unmarshall.DomainClassUnmarshaller - 使用ID解组类AImpl时出错... 消息:属性AImpl.status未映射为[组件],但找到了打破的搜索命中。 ' 另外,如果我尝试通过超进行搜索,像 'A.search(“$ {查询}”)' 我接收不到任何结果,似乎什么也没有编入索引的A. – 2014-11-07 20:50:31

+0

@JulyAntonicheva从我到目前为止,我们已经看到框架将索引子类而不是父类,所以如果您尝试通过父类进行搜索,您将无法获得任何结果。实际上,我必须在我的所有子类中编写可搜索的闭包,也许有一个我没有看到的配置参数。我没有查询使用我的域名,因为我想要所有可能的结果。 – santi2332 2014-11-08 22:49:30

+0

@JulyAntonicheva关于你遇到的错误,可能是你没有指定你的属性作为一个组件,在我的例子中是“status component:true”,或者你改变了你的映射并且没有清理你的索引来重建它。 – santi2332 2014-11-08 22:54:52

相关问题