我在item
为parent
的儿童与父母关系中使用这种映射(嗯,它是一个缩短版本以使问题更容易) user_items
是children
。
curl -XPUT 'localhost:9200/myindex?pretty=true' -d '{
"mappings": {
"items": {
"dynamic": "strict",
"properties" : {
"title" : { "type": "string" },
"body" : { "type": "string" },
}},
"user_items": {
"dynamic": "strict",
"_parent": {"type": "items" },
"properties" : {
"user_id" : { "type": "integer" },
"source_id" : { "type": "integer" },
}}}}'
我经常提出的查询类型:
curl -XGET 'localhost:9200/myindex/items/_search?pretty=true' -d '{
"query": {
"bool": {
"must": [
{
"query_string": {
"fields": ["title", "body"],
"query": "mercado"
}
},
{
"has_child": {
"type": "user_items",
"query": {
"term": {
"user_id": 655
}}}}]}}}'
在此查询中,必须在给定title
上的字段body
和mercado
上搜索字符user_id
,在这种情况下655
。< / p>
这些查询中的第一个是veeeeeeeeeeeeeeeery慢,最多可能需要15秒。以下是非常快(<0.5秒)
我读到第一个查询速度太慢的原因是它被缓存,然后其余查询很快,因为它适用于缓存的内容。
我读过我可以使用"loading" : "eager"
来提升第一个查询。所以我在一个名为myindex_new
{
"mappings": {
"items": {
"dynamic": "strict",
"properties" : {
"title" : { "type": "string" ,
"fielddata": {
"loading" : "eager"}},
"body" : { "type": "string",
"fielddata": {
"loading" : "eager"}},
}},
"user_items": {
"dynamic": "strict",
"_parent": {"type": "items" },
"properties" : {
"user_id" : { "type": "integer" },
"source_id" : { "type": "integer" },
}}}}'
...并按如下方式重新编制索引:
curl -XPOST 'localhost:9200/_reindex' -d '{
"source" : {
"index" : "myindex"
},
"dest" : {
"index" : "myindex_new"
}
}'
问题是我没有得到任何更好的结果。如果我使用eager
查询新索引,第一个查询仍然很慢。我也尝试在子字段上添加eager
,但它仍然很慢。
我能做出与众不同的事吗?我在重新索引上做错了什么?
提前致谢!
答案 0 :(得分:2)
Fielddata用于对这些特定字段进行排序和聚合。它不会对您的特定查询提供帮助,因为您不会将这些字段用于排序或内部聚合。我尝试了不同类型的急切加载,而不是父母的字段:"loading": "eager_global_ordinals"
。更完整的示例here。
亲子关系使用全局序数来加速连接。全局序数有两个目的:将associating numerics with string fields和我上面提到的内存使用量减少。
Elasticserch正在父母和孩子之间使用内存中的连接来使关系起作用。对于这些连接,使用全局序数。它们需要构建和预加载。使用"loading": "eager_global_ordinals"
它应该预先加载全局序数并使搜索更快,因为这些连接已经预先加载到内存中。