elasticsearch - 搜索常用前缀关键字时快速返回
问题描述
有一个公司索引
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
}
一般情况下,用户会搜索特定的名称,例如阿里巴巴,在这种情况下响应时间并不慢,但是如果用户搜索常见的前缀例如北京上海,它会很慢。
确实存在某种方式可以实现这个目的,即如果用户搜索一些公共前缀,只返回请求的大小文档,其中只包含公共前缀不需要分数或其他工作
解决方案
推荐阅读
- android - 如何旋转对话框(带动画)?
- r - 根据 R 中的条件删除/过滤行
- c++ - 如何将 QImage 格式化为 BAYER 颜色 (GRBG)?
- wordpress - 在 Wordpress 古腾堡编辑器的根容器中添加一个类
- c# - 在 azure sql 上连接到数据库的问题
- typescript - 为什么不为复杂对象“输入”窄类型?
- python - 黑帽 Python - 数据包嗅探器 - 调试
- java - Microsoft TPM Tss.java 实现 Samples.java 给出错误
- angular - 在管道中使用 flatMap
- amazon-web-services - Cloudfront https 在 chrome 和 firefox 中重定向,但不是 safari