2

I've got the following model, Article, which can be assigned tags (like hashtags):

@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}

Here is the Tag model:

@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;

Using spring-data-elasticsearch I'm trying to query using a tagName. I've tried the following QueryBuilder queries:

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

But end up getting the following stack errors:

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]]; }

What am I doing wrong?

1 Answer 1

2

Try using the following SearchQuery setup:

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

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

You should be using a filtered query and matching all entities.

Sign up to request clarification or add additional context in comments.

1 Comment

I think this is not working for some time already. I cant see any "FilterBuilder" related class on spring-data-elastic

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.