elasticsearch - ElasticSearch查询速度慢,并且第一次查询总是花费太多时间

标签 elasticsearch lucene elasticsearch-dsl elasticsearch-7 elasticsearch-nested

我是Elasticsearch的新手,当我确实要与多个搜索词匹配以及与嵌套文档匹配时,查询速度很慢,由于Elasticsearch缓存,基本上第一次查询需要7-10秒,之后需要5-6秒,但是查询具有匹配的非嵌套对象的速度很快,即100ms之内。
我在具有250GB RAM和500GB磁盘空间的AWS实例中运行 Elasticsearch ,我有一个模板和204个索引,在单个节点中总共索引了约107百万个文档,每个索引包含2个分片,并且我保持了30GB的堆大小。
以下是我的内存使用情况:
memory
我可以将嵌套对象的数量超过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":{
                
            }
        }
    }
}
我确定我缺少明显的东西。

最佳答案

简单的事情:track_total_hits应该设置为false。
通过强制合并进行维护也可能会有所帮助。
fisrt和下一个请求时间之间的差异是由于elasticsearch缓存。
但是,如果我的理解能力很好,那么您可以在一个文档上获得超过5万条评论?
如果是对的,那就太重要了。
您可以考虑反转映射吗?
具有将相关产品嵌入对象中的评论索引。它应该快得多。

PUT reviews 
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text"
      },
      "review_date": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||yyyy-MM||yyyy"
      },
      "product": {
        "properties": {
          "product_number": {
            "type": "text",
            "analyzer": "keyword"
          },
          "product_name": {
            "type": "text"
          },
          "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"
          }
        }
      }
    }
  }
}

关于elasticsearch - ElasticSearch查询速度慢,并且第一次查询总是花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64586835/

相关文章:

elasticsearch - 创建索引时如何解决 “Failed to parse content to map”错误?

elasticsearch - 我可以通过ElasticSearch Bulk Api中的查询进行更新吗?

elasticsearch - 如何聚合直到在 ElasticSearch 中达到某个值?

search - 更改Stemmer时是否应该在Elasticsearch中为文档重新编制索引?

sql-server - SQL Server 全文搜索是搜索短语而不是文档的正确工具吗?

java - Lucene/Solr 用于近似(公司)名称匹配

python - 更新到 elasticsearch 2.3 后无法定位嵌套的地理点

python - KeyError访问elasticsearch_dsl Python客户端中的inner_hits

python - ElasticSearch 中 multiSearch 的最佳批量查询大小

elasticsearch - 如何在bucket_script中使用父级的同级存储桶路径?