我正在阅读elasticsearch的文档,此[page] [1]讨论了使用将孩子映射到父类型_parent
。
如果我有被称为孩子的email
父母,则被称为account
:
每种类型的字段:
account (http://localhost:9200/myapp/account/1)
========
id
name
some_other_info
state
email (http://localhost:9200/myapp/email/1?parent=1)
========
id
email
我怎么能在搜索name
领域account
和email
领域的email
前提是state
的account
是active
?
有没有办法让父母拥有的所有孩子(某种类型或任何类型)?
在索引子文档时,是否可以将父对象作为对象属性传递给JSON数据,而不是将其作为查询字符串的一部分?
在尝试了imotov的建议之后,我想到了以下查询:
这是在执行 http://localhost:9200/myapp/account/_search
{
"query": {
"bool": {
"must": [
{
"prefix": {
"name": "a"
}
},
{
"term": {
"statuses": "active"
}
}
],
"should": [
{
"has_child": {
"type": "emailaddress",
"query": {
"prefix": {
"email": "a"
}
}
}
}
]
}
}
}
问题是上述内容没有给我提供电子邮件匹配的任何帐户。
我想要的效果本质上是这样的:
account
或任何emailaddress
类型的名称检查用户的查询。accounts
匹配,则将它们退回。如果emailaddress
匹配,则返回其上级帐户。因此,我基本上需要能够OR
在2种类型之间进行搜索并返回匹配项的父类型。
测试数据:
curl -XPUT http://localhost:9200/test/account/1 -d '{
"name": "John Smith",
"statuses": "active"
}'
curl -XPUT http://localhost:9200/test/account/2 -d '{
"name": "Peter Smith",
"statuses": "active"
}'
curl -XPUT http://localhost:9200/test/account/3 -d '{
"name": "Andy Smith",
"statuses": "active"
}'
//Set up mapping for parent/child relationship
curl -XPUT 'http://localhost:9200/test/email/_mapping' -d '{
"emails" : {
"_parent" : {"type" : "account"}
}
}'
curl -XPUT http://localhost:9200/test/email/1?parent=1 -d '{
"email": "john@smith.com"
}'
curl -XPUT http://localhost:9200/test/email/2?parent=1 -d '{
"email": "admin@mycompany.com"
}'
curl -XPUT http://localhost:9200/test/email/3?parent=1 -d '{
"email": "abcd@efg.com"
}'
curl -XPUT http://localhost:9200/test/email/4?parent=2 -d '{
"email": "peter@peter.com"
}'
curl -XPUT http://localhost:9200/test/email/5?parent=3 -d '{
"email": "andy@yahoo.com"
}'
curl -XPUT http://localhost:9200/test/email/6?parent=3 -d '{
"email": "support@mycompany.com"
}'
imotov的解决方案为我工作。我已经找到另一种方法是查询account
S代表status = active
,然后运行bool
的结果,并使用过滤器has_child
对孩子的类型和prefix
在name
内部bool
过滤器。
elasticsearch和关系数据库之间的重要区别是elasticsearch无法执行联接。在elasticsearch中,您始终在搜索单个索引或索引并集。但是在父/子关系的情况下,可以使用对子索引的查询来限制父索引中的结果。例如,您可以对account
类型执行此查询。
{
"bool": {
"must": [
{
"text" : { "name": "foo" }
}, {
"term" : { "state": "active" }
}, {
"has_child": {
"type": "email",
"query": {
"text": {"email": "bar" }
}
}
}
]
}
}
该查询将仅返回父文档(不返回子文档)。您可以使用此查询返回的父代ID,使用field来查找该父代的所有子代,_parent
默认情况下,该字段已存储并建立索引。
{
"term" : { "_parent": "1" }
}
或者,您可以将结果只限于包含bar
该字段中单词的子级email
:
{
"bool": {
"must": [
{
"term" : { "_parent": "1" }
}, {
"text" : { "email": "bar" }
}
]
}
}
我认为除非您使用_bulk
indexing,
否则无法在json中指定parent
。
这是使用问题中提供的测试数据可以实现电子邮件查找的方式:
#!/bin/sh
curl -XDELETE 'http://localhost:9200/test' && echo
curl -XPOST 'http://localhost:9200/test' -d '{
"settings" : {
"number_of_shards" : 1,
"number_of_replicas" : 0
},
"mappings" : {
"account" : {
"_source" : { "enabled" : true },
"properties" : {
"name": { "type": "string", "analyzer": "standard" },
"statuses": { "type": "string", "index": "not_analyzed" }
}
},
"email" : {
"_parent" : {
"type" : "account"
},
"properties" : {
"email": { "type": "string", "analyzer": "standard" }
}
}
}
}' && echo
curl -XPUT 'http://localhost:9200/test/account/1' -d '{
"name": "John Smith",
"statuses": "active"
}'
curl -XPUT 'http://localhost:9200/test/account/2' -d '{
"name": "Peter Smith",
"statuses": "active"
}'
curl -XPUT 'http://localhost:9200/test/account/3' -d '{
"name": "Andy Smith",
"statuses": "active"
}'
//Set up mapping for parent/child relationship
curl -XPUT 'http://localhost:9200/test/email/1?parent=1' -d '{
"email": "john@smith.com"
}'
curl -XPUT 'http://localhost:9200/test/email/2?parent=1' -d '{
"email": "admin@mycompany.com"
}'
curl -XPUT 'http://localhost:9200/test/email/3?parent=1' -d '{
"email": "abcd@efg.com"
}'
curl -XPUT 'http://localhost:9200/test/email/4?parent=2' -d '{
"email": "peter@peter.com"
}'
curl -XPUT 'http://localhost:9200/test/email/5?parent=3' -d '{
"email": "andy@yahoo.com"
}'
curl -XPUT 'http://localhost:9200/test/email/6?parent=3' -d '{
"email": "support@mycompany.com"
}'
curl -XPOST 'http://localhost:9200/test/_refresh'
echo
curl 'http://localhost:9200/test/account/_search' -d '{
"query": {
"bool": {
"must": [
{
"term": {
"statuses": "active"
}
}
],
"should": [
{
"prefix": {
"name": "a"
}
},
{
"has_child": {
"type": "email",
"query": {
"prefix": {
"email": "a"
}
}
}
}
],
"minimum_number_should_match" : 1
}
}
}' && echo
问题内容: 我在 MySQL中* 有如下的 注释 表: * 用户可以添加 新的 注释,因为它们不是其他注释的子对象,所以将没有parent_id。用户还可以 回复 通过先前方法添加的评论,因此它们是主要评论的子级,例如在第二层级上。该 PARENT_ID 列表示父评论的ID,如果存在的话。如果注释没有父母,则默认 parent_id 为-1。 话虽如此,我想查询表中的所有注释,每个父项后跟其子级,
问题内容: 有没有办法从mySQL的子查询中指定父查询字段? 例如: 我已经用PHP编写了一个基本的公告板类型程序。 在数据库中,每个帖子都包含:id(PK)和parent_id(父帖子的ID)。如果帖子本身是父项,则其parent_id设置为0。 我正在尝试编写一个mySQL查询,该查询将查找每个父级帖子以及父级拥有的子级数。 棘手的是,第一个 ID 不知道它应该引用子查询之外的第二个 ID 。
问题内容: 我的索引中有与- 相关的文档,并希望获取按孩子数排序的父母名单。有什么办法吗?我正在使用1.5.1 现在,通过使用功能,我可以轻松获得子文档的数量以及父查询的结果,但是似乎无法从脚本或搜索/评分功能访问值。有任何想法吗? 问题答案: 好吧,我终于找到了答案。感谢@doctorcal在#elasticsearch IRC 上的提示 正如我在这个问题提到的,我们可以使用每个家长让孩子的名单
问题内容: 最初,我一直在尝试获取父母的名单以及每个父母的一个最近的孩子。我已经知道如何使用以下查询 但是问题是,结果不包括没有孩子的父母。添加也无济于事。所以我想我可以对所有没有孩子的父母进行查询,然后将这两个查询合并为一个查询。但是我在建立这样的查询时遇到了麻烦。将不胜感激任何建议。 问题答案: 这是您的查询:
问题内容: 我想将以下SQL查询转换为Elasticsearch之一。谁能帮上忙 我尝试了以下方法: 但不确定我是否做对了,因为它无法验证结果。似乎要在聚合内添加查询。 问题答案: 假设您使用Elasticsearch 2.x,则有可能在Elasticsearch中 具有 -semantics。我不知道2.0之前的可能性。 您可以使用新的Pipeline Aggregation Bucket Se
您可以看到,子查询中没有使用协议实体路径a1的别名,而是被协议实体路径A2的别名所取代。在querydsl中还需要做一些其他的事情才能生成这个查询吗?