如何在elasticsearch中访问嵌套的json?

时间:2015-10-30 17:37:59

标签: java json elasticsearch

我跟随json:

    metadata: {
    authors: [

    ],
    links: [
        {
            href: "http://www.latimes.com/opinion/readersreact/la-le-1028-wednesday-meat-cancer-20151028-story.html#navtype=outfit",
            value: "Why hot dogs and bacon aren't as dangerous as cigarettes"
        },
        {
            href: "http://www.latimes.com/opinion/readersreact/la-le-1028-wednesday-porter-ranch-lausd-20151028-story.html#navtype=outfit",
            value: "LAUSD school in Porter Ranch shows the importance of parent involvement"
        },
        {
            href: "http://www.latimes.com/opinion/readersreact/la-le-1028-wednesday-billboards-20151028-story.html#navtype=outfit",
            value: "Maine and Vermont show L.A. what life is like without billboards"
        },
        {
            href: "http://www.latimes.com/opinion/readersreact/la-le-1028-wednesday-broad-beach-20151028-story.html#navtype=outfit",
            value: "Malibu beach-front homeowners, meet King Canute"
        }
    ]
},

我想在elasticsearch中搜索metadata.links.value:

requestBuilder.setQuery(QueryBuilders.matchQuery("metadata.links.value", "Malibu"));

但遗憾的是,这并不奏效。当我输入一个值时,我得到0次点击。

我做错了什么?

更新

这是我的完整代码

 public List<ArticleExtraction> search(String searchQuery, SearchProvider searchProvider) {
    TransportClient client = searchProvider.getClient();
    Map<String, String> query = new HashMap<>();
    ArrayList<String> singleQuery = new ArrayList<>();
    if (searchQuery.length() > 0 && searchQuery.contains(":")) {
        String[] queries = searchQuery.split(",");
        for (String q : queries) {
            String[] jsonQuery = q.split(":");
            query.put(jsonQuery[0], jsonQuery[1]);
        }
    } else {
        String[] queries = searchQuery.split(",");
        for (String q : queries) {
            singleQuery.add(q);
        }
    }
    SearchRequestBuilder requestBuilder = client.prepareSearch("crawlbot")
            .setTypes("item")
            .setSize(100);

    for (Map.Entry<String, String> e : query.entrySet()) {
        requestBuilder.setQuery(QueryBuilders.matchQuery(e.getKey(), e.getValue()));
    }
    for (String q : singleQuery) {
        requestBuilder.setQuery(QueryBuilders.queryStringQuery(q));
    }
    SearchResponse response = requestBuilder.execute().actionGet();

    List<ArticleExtraction> articles = new ArrayList<>();

    SearchHit[] hits = response.getHits().getHits();
    for (SearchHit hit : hits) {
        String sourceAsString = hit.getSourceAsString();
        if (sourceAsString != null) {
            JsonObject json = new JsonParser().parse(sourceAsString).getAsJsonObject();
            if (json.has("article")) {
                Gson gson = new Gson();
                articles.add(gson.fromJson(json.get("article"), ArticleExtraction.class));
            }
        }
    }

    return articles;

说明:

searchQuery的输入可能是:

metadata.links.value:马里布

或者如果它是单个查询:malibu

我制作了一些代码,因此两个查询都可以被接受

映射(如果这变大,则为sry)

mappings: {
    item: {
        properties: {
            article: {
                properties: {
                    description: {
                        type: "string"
                    },
                    description_html: {
                        type: "string"
                    },
                    entities: {
                        properties: {
                            count: {
                                type: "long"
                            },
                            meta: {
                                type: "object"
                            },
                            name: {
                                type: "string"
                            },
                            type: {
                                type: "string"
                            }
                        }
                    },
                    favicon_url: {
                        type: "string"
                    },
                    images: {
                        properties: {
                            colors: {
                                properties: {
                                    color: {
                                        type: "long"
                                    }
                                }
                            },
                            entropy: {
                                type: "double"
                            },
                            height: {
                                type: "long"
                            },
                            url: {
                                type: "string"
                            },
                            width: {
                                type: "long"
                            }
                        }
                    },
                    keywords: {
                        properties: {
                            label: {
                                type: "string"
                            },
                            score: {
                                type: "double"
                            }
                        }
                    },
                    language: {
                        type: "string"
                    },
                    metadata: {
                        properties: {
                            authors: {
                                properties: {
                                    name: {
                                        type: "string"
                                    }
                                }
                            },
                            links: {
                                properties: {
                                    href: {
                                        type: "string"
                                    },
                                    value: {
                                        type: "string"
                                    }
                                }
                            },
                            twitter: {
                                type: "string"
                            }
                        }
                    },
                    provider_display: {
                        type: "string"
                    },
                    provider_name: {
                        type: "string"
                    },
                    provider_url: {
                        type: "string"
                    },
                    published: {
                        type: "string"
                    },
                    published_long: {
                        type: "long"
                    },
                    summary: {
                        type: "string"
                    },
                    title: {
                        type: "string"
                    },
                    url: {
                        type: "string"
                    }
                }
            },
            id: {
                properties: {
                    _inc: {
                        type: "long"
                    },
                    _machine: {
                        type: "long"
                    },
                    _new: {
                        type: "boolean"
                    },
                    _time: {
                        type: "long"
                    }
                }
            },
            job: {
                properties: {
                    api: {
                        type: "long"
                    },
                    crawl_depth: {
                        type: "long"
                    },
                    max_pages: {
                        type: "long"
                    },
                    name: {
                        type: "string"
                    },
                    status: {
                        type: "long"
                    },
                    url: {
                        type: "string"
                    },
                    userid: {
                        type: "long"
                    }
                }
            },
            query: {
                properties: {
                    match: {
                        properties: {
                            name: {
                                type: "string"
                            }
                        }
                    }
                }
            }
        }
    }
},

1 个答案:

答案 0 :(得分:2)

元数据包含在文章根对象中。

因此,您的查询应构建为:

QueryBuilders.matchQuery("article.metadata.links.value"‌​, "Malibu");