我是elasticsearch的新手,当我需要匹配多个搜索词以及匹配嵌套文档时,我的查询速度很慢,基本上第一次查询需要7-10秒,之后由于elasticsearch缓存的原因需要5-6秒,但是对于只匹配的非嵌套对象的查询速度很快,即在100毫秒内。
我在aws示例中运行ElasticSearch,有250gbram和500gbdisk空间,我有一个模板和204个索引,总共索引了1.07亿个文档,每个索引在一个节点上有2个碎片,我保持了30gb的堆大小。
以下是我的内存使用情况:
我可以有超过50k的嵌套对象,所以我已经将长度增加到500k,在这个嵌套对象上搜索花费了太多的时间,在嵌套对象以外的字段上的任何or(应该匹配)操作也需要时间,有什么方法可以提高嵌套对象的查询性能吗?或者我的配置有什么问题吗?有什么方法可以让我的第一个查询也更快?
{
"index_patterns": [
"product_*"
],
"template": {
"settings": {
"index.store.type": "mmapfs",
"number_of_shards":2,
"number_of_replicas": 0,
"index": {
"store.preload": [
"*"
],
"mapping.nested_objects.limit": 500000,
"analysis": {
"analyzer": {
"cust_product_name": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"english_stop",
"name_wordforms",
"business_wordforms",
"english_stemmer",
"min_value"
],
"char_filter": [
"html_strip"
]
},
"entity_name": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"english_stop",
"business_wordforms",
"name_wordforms",
"english_stemmer"
],
"char_filter": [
"html_strip"
]
},
"cust_text": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"english_stop",
"name_wordforms",
"english_stemmer",
"min_value"
],
"char_filter": [
"html_strip"
]
}
},
"filter": {
"min_value": {
"type": "length",
"min": 2
},
"english_stop": {
"type": "stop",
"stopwords": "_english_"
},
"business_wordforms": {
"type": "synonym",
"synonyms_path": "<some path>/business_wordforms.txt"
},
"name_wordforms": {
"type": "synonym",
"synonyms_path": "<some path>/name_wordforms.txt"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
}
}
}
}
},
"mappings": {
"dynamic": "strict",
"properties": {
"product_number": {
"type": "text",
"analyzer": "keyword"
},
"product_name": {
"type": "text",
"analyzer": "cust_case_name"
},
"first_fetch_date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||yyyy-MM||yyyy"
},
"last_fetch_date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||yyyy-MM||yyyy"
},
"review": {
"type": "nested",
"properties": {
"text": {
"type": "text",
"analyzer": "cust_text"
},
"review_date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||yyyy-MM||yyyy"
}
}
}
}
},
"aliases": {
"all_products": {}
}
},
"priority": 200,
"version": 1,
}
如果我在评论文本中搜索任何特定的词,那么回复就花费了太多的时间。
{
"_source":{
"excludes":["review"]
},
"size":1,
"track_total_hits":true,
"query":{
"nested":{
"path":"review",
"query":{
"match":{
"review.text":{
"query":"good",
"zero_terms_query":"none"
}
}
}
}
},
"highlight":{
"pre_tags":[
"<b>"
],
"post_tags":[
"</b>"
],
"fields":{
"product_name":{
}
}
}
}
我肯定我遗漏了一些明显的东西。
1条答案
按热度按时间daupos2t1#
简单的事情:track\u total\u hits应该设置为false。使用强制合并进行维护也会有所帮助。
第一次和下一次请求时间之间的差异是由于elasticsearch缓存造成的。
但如果我的理解是好的,你可以有超过5万个医生的评论?如果是对的,那就太过分了。你能把你的Map倒过来吗?有一个嵌入相关产品和对象的评审索引。应该快得多。