首页 > 解决方案 > 搜索常用前缀关键字时快速返回

问题描述

有一个公司索引

health status index               uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   company             KTngnM6ASD-_KdU0FFAWRA   1   0   88243299     29462913     24.7gb         24.7gb

因为许多公司名称都有相同的前缀,例如上海。所以如果你只搜索Shanghai它会很慢

从慢日志查询:

{
  "size": 1,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "name": {
                  "query": "Shanghai",
                  "operator": "AND",
                  "prefix_length": 0,
                  "max_expansions": 50,
                  "fuzzy_transpositions": true,
                  "lenient": false,
                  "zero_terms_query": "NONE",
                  "auto_generate_synonyms_phrase_query": true,
                  "boost": 1.0
                }
              }
            },
            {
              "match": {
                "shortName": {
                  "query": "Shanghai",
                  "operator": "OR",
                  "prefix_length": 0,
                  "max_expansions": 50,
                  "fuzzy_transpositions": true,
                  "lenient": false,
                  "zero_terms_query": "NONE",
                  "auto_generate_synonyms_phrase_query": true,
                  "boost": 2.9
                }
              }
            },
            { "term": { "name.keyword": { "value": "Shanghai", "boost": 2.0 } } },
            { "match_phrase": { "name": { "query": "Shanghai", "slop": 0, "zero_terms_query": "NONE", "boost": 1.0 } } }
          ],
          "adjust_pure_negative": true,
          "minimum_should_match": "1",
          "boost": 1.0
        }
      },
      "functions": [
        {
          "filter": { "match_all": { "boost": 1.0 } },
          "field_value_factor": { "field": "weight", "factor": 1.0, "missing": 0.0, "modifier": "none" }
        },
        {
          "filter": { "match_all": { "boost": 1.0 } },
          "field_value_factor": { "field": "viewCount", "factor": 1.0, "missing": 0.0, "modifier": "log1p" }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "sum",
      "max_boost": 3.4028235e38,
      "boost": 1.0
    }
  },
  "profile": true
}

一般情况下,用户会搜索特定的名称,例如阿里巴巴,在这种情况下响应时间并不慢,但是如果用户搜索常见的前缀例如北京上海,它会很慢。

确实存在某种方式可以实现这个目的,即如果用户搜索一些公共前缀,只返回请求的大小文档,其中只包含公共前缀不需要分数或其他工作

标签: elasticsearch

解决方案


推荐阅读