Массив запросов Spring data elasticsearch из вложенных объектов

У меня есть следующая модель, статья, которой можно присвоить теги (например, хэштеги):

@Entity
@Table(name="article")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
        name="post_type",
        discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue("text")
@Document(indexName="article", type="article")
public class Article implements Serializable {
    @org.springframework.data.annotation.Id
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="articleId")
    private int articleId;
    ... data for article...
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id", nullable = false)
    private User userId;

    @Field( type = FieldType.Nested)
    @ManyToMany(fetch = FetchType.EAGER)
    private Set<Tag> tags = new LinkedHashSet<>();Simple {tagName, tagId}

Вот модель тега:

@Entity
@Table(name = "tag")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
        name="tag_type",
        discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue("tag")
public class Tag {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="id")
    private int tagId;

    @Column(name="tag_name")
    private String tagName;

Используя spring-data-elasticsearch, я пытаюсь выполнить запрос, используя имя тега. Я пробовал следующие запросы QueryBuilder:

QueryBuilder builder = nestedQuery("tags.tagName", matchQuery("tags.tagName", tagName));
QueryBuilder builder = nestedQuery("tags", matchQuery("tags.tagName", tagName));

Но в итоге получаем следующие ошибки стека:

org.elasticsearch.action.search.SearchPhaseExecutionException: Failed to execute phase[dfs], all shards failed;
shardFailures {
    [10277 cVjTUK3mhchd - uBmw][article][0]: SearchParseException[[article][0]: from[0], size[10]: Parse Failure[Failed to parse source[{ "from": 0, "size": 10, "query": { "nested": { "query": { "match": { "tags.tagName": { "query": "holiday", "type": "boolean" } } }, "path": "tags.tagName" } }, "sort": [{ "number_likes": { "order": "desc" } }] }]]];
    nested: QueryParsingException[[article][nested] failed to find nested object under path[tags.tagName]]; } {
    [10277 cVjTUK3mhchd - uBmw][article][1]: SearchParseException[[article][1]: from[0], size[10]: Parse Failure[Failed to parse source[{ "from": 0, "size": 10, "query": { "nested": { "query": { "match": { "tags.tagName": { "query": "holiday", "type": "boolean" } } }, "path": "tags.tagName" } }, "sort": [{ "number_likes": { "order": "desc" } }] }]]];
    nested: QueryParsingException[[article][nested] failed to find nested object under path[tags.tagName]]; } {
    [10277 cVjTUK3mhchd - uBmw][article][2]: SearchParseException[[article][2]: from[0], size[10]: Parse Failure[Failed to parse source[{ "from": 0, "size": 10, "query": { "nested": { "query": { "match": { "tags.tagName": { "query": "holiday", "type": "boolean" } } }, "path": "tags.tagName" } }, "sort": [{ "number_likes": { "order": "desc" } }] }]]];
    nested: QueryParsingException[[article][nested] failed to find nested object under path[tags.tagName]]; } {
    [10277 cVjTUK3mhchd - uBmw][article][3]: SearchParseException[[article][3]: from[0], size[10]: Parse Failure[Failed to parse source[{ "from": 0, "size": 10, "query": { "nested": { "query": { "match": { "tags.tagName": { "query": "holiday", "type": "boolean" } } }, "path": "tags.tagName" } }, "sort": [{ "number_likes": { "order": "desc" } }] }]]];
    nested: QueryParsingException[[article][nested] failed to find nested object under path[tags.tagName]]; } {
    [10277 cVjTUK3mhchd - uBmw][article][4]: SearchParseException[[article][4]: from[0], size[10]: Parse Failure[Failed to parse source[{ "from": 0, "size": 10, "query": { "nested": { "query": { "match": { "tags.tagName": { "query": "holiday", "type": "boolean" } } }, "path": "tags.tagName" } }, "sort": [{ "number_likes": { "order": "desc" } }] }]]];
    nested: QueryParsingException[[article][nested] failed to find nested object under path[tags.tagName]]; }

Что я делаю не так?


person James111    schedule 05.09.2016    source источник


Ответы (1)


Попробуйте использовать следующую настройку SearchQuery:

QueryBuilder builder = matchAllQuery();
FilterBuilder filterBuilder = boolFilter().must(termFilter("tags.tagName", tagName));

SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.filteredQuery(builder, filterBuilder))

Вы должны использовать отфильтрованный запрос и сопоставлять все сущности.

person bakersam1    schedule 05.09.2016