Spring Data elasticsearch @Query嵌套对象的注释
我有两节课,
@Document public class PracticeQuestion { private int userId; private List questions; // Getters and setters } public class Question { private int questionID; private String type; // Getters and setters }
我的JSON文档是这样的,
{ "_id" : ObjectId("506d9c0ce4b005cb478c2e97"), "userId" : 1, "questions" : [ { "questionID" : 1, "type" : "optional" }, { "questionID" : 3, "type" : "mandatory" } ] }
我应该如何使用@Query
注释编写查询方法以通过userId和questionID查找PracticeQuestion。
谢谢你的任何建议。
如果要按userId和QuestionId进行搜索。 你有2个选择。
- 使用嵌套查询(上例中的问题是一种嵌套对象,弹性搜索支持对嵌套对象的搜索。)。 你可以在这里阅读更多相关信息。
您可以使用如下所示的方法findByUserId创建PracticeQuestionRepository
。
public interface PracticeQuestionRepository extends ElasticsearchRepository { @Query("{"query":{"bool":{"must":[{"match":{"userId":"?0"}},{"nested":{"path":"questions","query":{"bool":{"must":[{"match":{"questions.id":"?1"}}]}}}}]}}}")" Page findByUserIdAndQuestionId(String userId, String questionId, Pageable pageable); }
- 如果您不想使用嵌套对象。 De规范化架构并将问题和userId展平在同一级别,然后对userId和QuestionId发出查询。
例如文件1
{ "_id": "506d9c0ce4b005cb478c2e97", "userId": 1, "questionID": 1, "type": "optional" }
文件2
{ "_id": "506d9c0ce4b005cb478c2e97", "userId": 1, "questionID": 1, "type": "optional" }
存储库代码
public interface PracticeQuestionRepository extends ElasticsearchRepository { @Query("{"bool" : {"must" : [ {"field" : {"userId" : "?0"}}, {"field" : {"questionId" : "?1"}} ]}}"") Page findByUserIdAndQuestionId(String userId, String questionId, Pageable pageable); }
有关更多示例,请参阅此链接
- Elasticsearch服务器发现配置
- 在ElasticSearch中使用Java API时如何从JSON DSL构造QueryBuilder?
- Spring Data Elasticsearch:具有相同文档的多索引
- Elasticsearch – EdgeNgram + highlight + term_vector =错误的亮点
- 在ElasticSearch中获取SearchResponse的结果
- elasticsearch java API:matchAll搜索查询不返回结果?
- Elasticsearch映射设置’not_analyzed’并在Java中按字段分组
- 具有当前弹性搜索版本的Spring Boot应用程序
- elasticsearch – 返回字段的标记