我正在阅读 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
如果of是,我如何搜索
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
匹配,则返回其父帐户。 - 每次搜索最多限制为 x 个(比如 10 个)帐户。
所以,我基本上需要能够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
。