analyzer
参数对查询性能的影响
- 分析时间开销:
- 如果设置了
analyzer
,Elasticsearch需要对查询字符串进行分析。分析过程包括分词、过滤等操作,这会增加额外的计算开销。例如,使用复杂的自定义分析器可能包含多个分词器和过滤器组合,这会显著增加分析查询字符串的时间。
- 不设置
analyzer
时,Elasticsearch可能使用默认的分析器或不进行分析(取决于具体情况),相对来说时间开销较小。
- 匹配精准度与结果集大小:
- 合适的
analyzer
能提高匹配精准度。例如,在文本搜索场景中,对英文使用english
分析器可以进行词干提取等操作,使查询更智能,可能减少结果集大小,从而加快查询返回速度。
- 但如果
analyzer
设置不当,比如在不需要词干提取的场景使用了会进行词干提取的分析器,可能会导致匹配到过多不相关的文档,增加结果集大小,进而降低查询性能,因为Elasticsearch需要处理更多数据来返回结果。
不同场景下合理设置analyzer
优化性能的示例
- 英文文本搜索场景:
- 场景描述:搜索英文技术文章,希望能够识别同义词、进行词干提取等操作以提高搜索精准度。
- 设置方式:使用
english
分析器。例如,在query_string
查询中设置analyzer
为english
:
{
"query": {
"query_string": {
"query": "computer programming",
"analyzer": "english",
"fields": ["content"]
}
}
}
- 好处:
english
分析器会对computer
和programming
进行词干提取等操作,能匹配到诸如computing
、programmer
等相关词干的文档,提高搜索精准度,同时减少不必要的匹配,优化查询性能。
- 精确匹配场景:
- 场景描述:搜索产品编号等精确字符串,不需要进行任何分词或词干提取等分析操作。
- 设置方式:不设置
analyzer
或使用keyword
分析器。例如:
{
"query": {
"query_string": {
"query": "ABC123",
"fields": ["product_id"]
}
}
}
{
"query": {
"query_string": {
"query": "ABC123",
"analyzer": "keyword",
"fields": ["product_id"]
}
}
}
- 好处:不进行分析或使用
keyword
分析器,能直接将查询字符串作为一个整体进行匹配,避免了分析带来的时间开销,提高查询性能,尤其适用于精确匹配的场景。
- 中文文本搜索场景:
- 场景描述:搜索中文新闻文章,希望能准确分词以提高搜索效果。
- 设置方式:可以使用
ik_smart
或ik_max_word
分析器(假设安装了IK分词器)。例如,使用ik_smart
分析器:
{
"query": {
"query_string": {
"query": "人工智能发展",
"analyzer": "ik_smart",
"fields": ["news_content"]
}
}
}
- 好处:
ik_smart
分析器能对中文进行智能分词,如将“人工智能发展”分为“人工智能”和“发展”,使匹配更合理,提高搜索性能。ik_max_word
会进行更细粒度的分词,适用于希望匹配更多相关结果的场景,但可能会增加结果集大小,在某些情况下需要权衡使用。