2016-09-05 3 views
2

У меня есть следующие модели, статьи, которые могут быть присвоены метки (например, хэштегов):Spring массив 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} 

Вот модель Tag:

@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 Я пытаюсь выполнить запрос с помощью tagName. Я попытался следующие 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]]; } 

Что я делаю неправильно?

ответ

2

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

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

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

Вы должны использовать фильтрованный запрос и согласование всех объектов.

+0

Ах, да, это сработало отлично. – James111