在ElasticSearch Spring java框架

时间:2015-07-06 16:17:18

标签: spring elasticsearch spring-data-elasticsearch

我在Spring中定义了这个用于查询Elascticsearch的接口。我添加了@Query注释来完成一些过滤。

public interface ObjectElasticSearch extends ElasticsearchRepository<ElasticObject, String> {

@Query("{\"query\" : {\"filtered\" : {\"filter\" : { \"and\" : [ { \"term\" : { \"firstName\" : \":firstName\" }}, { \"term\" : { \"lastName\" : \"Baggins\" }} ] }}}}")
List<ElasticObject> findByDocFirstNameAndDocLastName(@Param("firstName") String firstName,
        @Param("lastName") String lastName);
};

完全忽略@Query注释。正如您所看到的,我尝试使用硬编码的姓氏,它对查询的结果没有影响。如果我在查询字符串中删除大括号,我不会收到任何错误。查询仍然有效,忽略过滤,并返回所有匹配。

有人可以帮我弄清楚我在这里做错了什么。

1 个答案:

答案 0 :(得分:0)

查询应返回bool,必填部分中的https://jsfiddle.net/2avm4a6n/20/可以涵盖您的所有搜索。

这是我的示例,对我来说,我有一个带有startTimestamp和endTimestamp的记录,我的方法将找到所有这些记录与指定的时间帧重叠+匹配字段的查询

    @Query("{\"bool\": {\"must\":["
        + "            {\"range\": {\"endTimestamp\": {\"gte\": ?0}}},"
        + "            {\"range\": {\"startTimestamp\": {\"lte\": ?1}}}"
        + "        ], \"should\": ["
        + "             {\"match\": {\"_all\": {\"query\": \"?2\", \"zero_terms_query\": \"all\"}}}"
        + "        ],"
        + "        \"minimum_should_match\" : 1"
        + "    }"
        + "}")